不得不说这是神题。

%%%   http://blog.csdn.net/samjia2000/article/details/51762811

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#define inf 0x3f3f3f3f
#define LL long long
#define eps 1e-8
#define N 100005
using namespace std;
inline int ra()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
} const int mod=1e++;
const int prime=; LL tim[N],q[N];
int k;
struct node{int to,x; LL v;}u[N];
bool cmp(node a, node b){return a.v<b.v;} struct tree
{
int cnt,head[N];
struct edge{int to,next;}e[N<<];
int n,r[N],fa[N],size[N];
LL v[N],rt[N],f[N];
LL suf[N],pre[N]; void insert(int x, int y){e[++cnt].next=head[x]; e[cnt].to=y; head[x]=cnt;}
void init()
{
cnt=;
for (int i=; i<=n; i++) head[i]=r[i]=f[i]=fa[i]=rt[i]=;
for (int i=; i<n; i++)
{
int x=ra(),y=ra();
insert(x,y); insert(y,x);
r[x]++; r[y]++;
}
} void dfs1(int x)
{
size[x]=;
for (int i=head[x];i;i=e[i].next)
{
if (e[i].to==fa[x]) continue;
fa[e[i].to]=x;
dfs1(e[i].to);
size[x]+=size[e[i].to];
}
k=;
for (int i=head[x];i;i=e[i].next)
if (fa[e[i].to]==x) q[++k]=v[e[i].to];
sort(q+,q+k+);
v[x]=;
for (int i=; i<=k; i++) v[x]=(v[x]*prime%mod+q[i])%mod;
v[x]=(v[x]*prime%mod+size[x])%mod;
} void dfs2(int x)
{
k=;
if (x>) u[++k].v=f[x],u[k].to=fa[x];
for (int i=head[x];i;i=e[i].next)
if (fa[e[i].to]==x)
{
u[++k].to=e[i].to;
u[k].v=v[e[i].to];
}
sort(u+,u++k,cmp);
for (int i=; i<=k; i++) pre[i]=(pre[i-]*prime%mod+u[i].v)%mod;
suf[k+]=;
for (int i=k; i>=; i--) suf[i]=(suf[i+]+u[i].v*tim[k-i]%mod)%mod;
for (int i=; i<=k; i++)
if (u[i].to!=fa[x])
{
f[u[i].to]=(pre[i-]*tim[k-i]%mod+suf[i+])%mod;
f[u[i].to]=(f[u[i].to]*prime%mod+n-size[u[i].to])%mod;
}
for (int i=head[x];i;i=e[i].next)
if (fa[e[i].to]==x) dfs2(e[i].to);
}
void cal()
{
dfs1(); dfs2();
for (int x=; x<=n; x++)
{
k=;
for (int i=head[x];i;i=e[i].next)
if (fa[e[i].to]==x) q[++k]=v[e[i].to];
if (fa[x]) q[++k]=f[x];
sort(q+,q+k+);
rt[x]=;
for (int i=; i<=k; i++) rt[x]=(rt[x]*prime%mod+q[i])%mod;
rt[x]=(rt[x]*prime%mod+n)%mod;
}
}
}a,b; int m;
set<LL> s; int main(int argc, char const *argv[])
{
tim[]=; s.clear();
m=ra();
for (int i=; i<=m+; i++) tim[i]=tim[i-]*prime%mod;
a.n=m; a.init(); b.n=m+; b.init(); a.cal(); b.cal();
for (int i=; i<=m; i++) s.insert(a.rt[i]);
for (int i=; i<=m+; i++)
if (b.r[i]== && ((i!= && s.find(b.f[i])!=s.end()) || (i== && s.find(b.v[b.e[b.head[i]].to])!=s.end())))
{
printf("%d\n",i); return ;
}
return ;
}

bzoj 4754: [Jsoi2016]独特的树叶的更多相关文章

  1. BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构

    题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...

  2. BZOJ4754 & 洛谷4323 & LOJ2072:[JSOI2016]独特的树叶——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4754 https://www.luogu.org/problemnew/show/P4323 ht ...

  3. Luogu P4323 [JSOI2016]独特的树叶

    一道比较好的树Hash的题目,提供一种不一样的Hash方法. 首先无根树的同构判断一般的做法只有树Hash,所以不会的同学可以做了Luogu P5043 [模板]树同构([BJOI2015]树的同构) ...

  4. bzoj4754[JSOI2016]独特的树叶

    这个题....别人写得怎么都....那么短啊? 我怎么....WA了好几次啊....怎么去loj扒了数据才调出来啊? 这个算法...怎么我还是不知道对不对啊 怎么回事啊怎么回事啊怎么回事啊? 请无视上 ...

  5. BZOJ4754 JSOI2016独特的树叶(哈希)

    判断两棵无根树是否同构只需要把重心提作根哈希即可.由于只添加了一个叶子,重心的位置几乎不发生偏移,所以直接把两棵树的重心提起来,逐层找哈希值不同且对应的两子树即可.被一个普及组子问题卡一年. #inc ...

  6. Luogu 4323 [JSOI2016]独特的树叶

    新技能get 树哈希,考虑到两棵树相同的条件,把每一个结点的哈希值和树的siz写进哈希值里去. 做出A树每一个结点为根时的树的哈希值丢进set中,然后暴力枚举B树中度数为1的点,求出删掉这个点之后的哈 ...

  7. P4323 [JSOI2016]独特的树叶(树哈希)

    传送门 树哈希?->这里 反正大概就是乱搞--的吧-- //minamoto #include<bits/stdc++.h> #define R register #define l ...

  8. [JSOI2016]独特的树叶

    https://zybuluo.com/ysner/note/1177340 题面 有一颗大小为\(n\)的树\(A\),现加上一个节点并打乱编号,形成树\(B\),询问加上的节点最后编号是多少? \ ...

  9. 【BZOJ4754】独特的树叶(哈希)

    [BZOJ4754]独特的树叶(哈希) 题面 BZOJ 给定一个\(n\)个节点的树A和一个\(n+1\)个节点的树\(B\) 求\(B\)的一个编号最小的节点,使得删去这个节点后\(A,B\)同构 ...

随机推荐

  1. Python 基础之正则之二 匹配分组,正则相关函数及表达式修饰符

    四.匹配分组   [元字符] 分组符号 a|b   匹配字符a 或 字符b  (如果两个当中有重合部分,把更长的那个放前面) (ab)   匹配括号内的表达式 ,将()作为一个分组 num  引用分组 ...

  2. Tesseract-OCR 4.1.0 安装和使用— windows及CentOS

    OCR(Optical character recognition) —— 光学文字识别,是图像处理的一个重要分支,中文的识别具有一定挑战性,特别是手写体和草书的识别,是重要和热门的科学研究方向 截止 ...

  3. Python 中命令行参数解析工具 docopt 安装和应用

    什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制. ...

  4. 在abp core中出现运行项目时EF获取到的appsetting.json或者appsettings.Production.json中的连接字符串为空

    原因:有可能是生成的bin或者debug文件夹下没有将appsetting.json或者appsettings.Production.json文件生成过去 解决方法:手动拷贝过去,或者设置成自动生成过 ...

  5. 汇编语言从入门到精通-5微机CPU的指令系统2

    微机CPU的指令系统 5.2.2 标志位操作指令 标志位操作指令是一组对标志位置位.复位.保存和恢复等操作的指令. 1.进位CF操作指令 a.清进位指令CLC(Clear Carry Flag):CF ...

  6. Java基础 -2.5

    布尔数据boolean类型 布尔类型的取值范围只有两个数据:true false. public class ddd { public static void main(String[] args) ...

  7. 第2节 Scala中面向对象编程:9、getClass和classOf;10、调用父类的constructor;11、抽象类和抽象字段;

    6.3.4.     Scala中getClass 和 classOf Class A extends class B B b=new A    b.getClass ==classOf[A] B b ...

  8. [libpng]CMake+VS2015下编译libpng,及使用小例

    编译前的工作 在编译libpng前,需要把zlib编译好,并加载到编译环境里. CMake + VS2015 下编译zlib,及使用小例 下载与解压 libpng的官网是 http://www.lib ...

  9. maven缺失ojdbc6解决方案 :Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错

    问题已解决,感谢博主,给您磕头了. | | 解决方法就是把缺少的 jar 手动添加到本地仓库中,再重新引入依赖即可.详情请参考以下链接. | | 转发自: https://blog.csdn.net/ ...

  10. Python爬虫教程-爬取5K分辨率超清唯美壁纸源码

    简介 壁纸的选择其实很大程度上能看出电脑主人的内心世界,有的人喜欢风景,有的人喜欢星空,有的人喜欢美女,有的人喜欢动物.然而,终究有一天你已经产生审美疲劳了,但你下定决定要换壁纸的时候,又发现网上的壁 ...