不得不说这是神题。

%%%   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 基础之深浅拷贝

    深浅拷贝 s=[[1,2],'fgfgf','cx'] s3=s.copy() print(s) print(s3) 测试 D:\python\python.exe D:/untitled/dir/f ...

  2. while语句及批量创建用户!

    1.while 循环语句的作用:重复测试某个条件,只要条件成立则反复执行2.while 语句结构while 条件测试操作do命令序列done ============================= ...

  3. 使用gitthub 创建项目搭建博客

    最近在学Andrew Ng 的机器学习,做了上买那个的练习题和变成作业,想着把自己做的编程作业放到GitHub,方便讨论,虽然之前注册了GitHub,但这两年整天在毕设方向的事,做的身心俱疲,再加上自 ...

  4. redhat 7.6 VI编辑操作

    模式一: 浏览模式 0 : 光标到行首 $ : 光标到行尾 gg:光标到首行 G:光标到尾行 yy:复制光标所在行 dd:剪切光标所在行,删除行 y11y:复制光标所在行,往下数,一共10行 p:粘贴 ...

  5. Codeforces1307B. Cow and Friend

    本题的难点是可以在y轴正轴动,但也是突破点,知道x轴都是整数,那么对于任意长度来说,能到达的最短是1,最长是本身长度,那么我们就选择最长的距离,跳到一个点,使这个点为再跳就超过终点,那么就可以用2次跳 ...

  6. Python 爬取 北京市政府首都之窗信件列表-[数据处理]

    日期:2020.01.24 博客期:132 星期五 [代码说明,如果要使用此页代码,必须在本博客页面评论区给予说明] //博客总体说明 1.准备工作 2.爬取工作 3.数据处理(本期博客) 4.信息展 ...

  7. Golang 如何交叉编译

    Golang 支持交叉编译,即在一个平台上生成另一个平台的可执行程序.方法如下: Mac 下编译 Linux 和 Windows 64位可执行程序 CGO_ENABLED=0 GOOS=linux G ...

  8. LNMP一键安装包 PHP自动升级脚本

    LNMP一键安装包 PHP自动升级脚本 2011年03月15日 上午 | 作者:VPS侦探 前一段时间完成了lnmp一键安装包的PHP自动升级脚本,今天发布出来,如果想升级PHP版本的lnmp用户可以 ...

  9. Batch批量替换hosts

    hosts文件替换 工作需要,要修改很多计算机的hosts文件,采用bat批量完成 解决的问题: 1.pc工作在非管理员权限,右键管理员权限太麻烦,因此采用执行中申请管理员权限的方式 2.hosts和 ...

  10. JavaScript 中 new 关键字结合构造函数创建对象

    步骤: new会在内存中创建一个新的空对象 new 会让this指向这个新的对象 执行构造函数(给这个新对象添加属性和方法) new会返回这个新对象