bzoj 4754: [Jsoi2016]独特的树叶
不得不说这是神题。
%%% 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]独特的树叶的更多相关文章
- BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构
题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...
- BZOJ4754 & 洛谷4323 & LOJ2072:[JSOI2016]独特的树叶——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4754 https://www.luogu.org/problemnew/show/P4323 ht ...
- Luogu P4323 [JSOI2016]独特的树叶
一道比较好的树Hash的题目,提供一种不一样的Hash方法. 首先无根树的同构判断一般的做法只有树Hash,所以不会的同学可以做了Luogu P5043 [模板]树同构([BJOI2015]树的同构) ...
- bzoj4754[JSOI2016]独特的树叶
这个题....别人写得怎么都....那么短啊? 我怎么....WA了好几次啊....怎么去loj扒了数据才调出来啊? 这个算法...怎么我还是不知道对不对啊 怎么回事啊怎么回事啊怎么回事啊? 请无视上 ...
- BZOJ4754 JSOI2016独特的树叶(哈希)
判断两棵无根树是否同构只需要把重心提作根哈希即可.由于只添加了一个叶子,重心的位置几乎不发生偏移,所以直接把两棵树的重心提起来,逐层找哈希值不同且对应的两子树即可.被一个普及组子问题卡一年. #inc ...
- Luogu 4323 [JSOI2016]独特的树叶
新技能get 树哈希,考虑到两棵树相同的条件,把每一个结点的哈希值和树的siz写进哈希值里去. 做出A树每一个结点为根时的树的哈希值丢进set中,然后暴力枚举B树中度数为1的点,求出删掉这个点之后的哈 ...
- P4323 [JSOI2016]独特的树叶(树哈希)
传送门 树哈希?->这里 反正大概就是乱搞--的吧-- //minamoto #include<bits/stdc++.h> #define R register #define l ...
- [JSOI2016]独特的树叶
https://zybuluo.com/ysner/note/1177340 题面 有一颗大小为\(n\)的树\(A\),现加上一个节点并打乱编号,形成树\(B\),询问加上的节点最后编号是多少? \ ...
- 【BZOJ4754】独特的树叶(哈希)
[BZOJ4754]独特的树叶(哈希) 题面 BZOJ 给定一个\(n\)个节点的树A和一个\(n+1\)个节点的树\(B\) 求\(B\)的一个编号最小的节点,使得删去这个节点后\(A,B\)同构 ...
随机推荐
- WEB - token
token概念参考 https://ninghao.net/blog/2834 https://stackoverflow.com/questions/1592534/what-is-token-ba ...
- RuntimeError: cuda runtime error (10) : invalid device ordinal
This is caused by the unmatching of gpu device number when loading a saved model. torch.load('my_fil ...
- T-SQL常用的函数
http://blog.sina.com.cn/s/blog_4af01cd50100hsac.html
- ssh访问ubuntu13.10
步骤: 首先确保网络连接是ok,网络连接方式"桥接“,手动配置 ip 192.168.1.9,和主机是同一网段 1.检查当前有没有安装openssh-server(已安装) 2. 安装ope ...
- 吴裕雄--天生自然 JAVA开发学习:解决java.sql.SQLException: The server time zone value报错
这个异常是时区的错误,因此只你需要设置为你当前系统时区即可,解决方案如下: import java.sql.Connection ; import java.sql.DriverManager ; i ...
- 华为事件对A股的影响思考
美国对华为实施禁商令: 利好:自主可控-替代品 软件:国产操作系统(中国软件,浪潮软件,湘邮科技...) 芯片:国产芯片(士微兰,国民技术...) 利好:华为优势产品 5G: 利好:反制资源 稀土永磁 ...
- 【PAT甲级】1028 List Sorting (25 分)
题意: 输入一个正整数N(<=100000)和C(C属于{1,2,3}),接下来输入N行,每行包括学生的六位学号(习惯用string输入,因为可能有前导零),名字和成绩(正整数).输出排序后的信 ...
- Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
- SQL注入之SQLmap
注意:sqlmap只是用来检测和利用sql注入点的,并不能扫描出网站有哪些漏洞,使用前请先使用扫描工具扫出sql注入点. 1.
- MVC webuploader 图片
AARTO:SaveNoticeAndDocument ~/Scripts/Upload/webuploader-0.1.4/dist/webuploader.js