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

题面

BZOJ

给定一个\(n\)个节点的树A和一个\(n+1\)个节点的树\(B\)

求\(B\)的一个编号最小的节点,使得删去这个节点后\(A,B\)同构

题解

树哈希

一个奇怪的姿势

总而言之,就是把树的各种信息乱七八糟的拼在一起强行哈希一下

真搞不懂这种丧病的东西为什么还能直接出成省选题,

随便一个模数还可能\(WA\)。。。

这种东西依我看只适合\(IOI\)赛制

至于怎么搞?想怎么搞怎么搞啊。。。。

你可以把子树的哈希值排序再哈希

也可以直接异或起来(这个很不错)

甚至还可以像菊开那样直接跑快速幂

反正想怎么玩怎么玩。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 111111
#define ull unsigned long long
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt,size[MAX],n;
void Add(int u,int v){e[++cnt]=(Line){v,h[u]};h[u]=cnt;}
ull hash[MAX];
set<ull> M;
const ull base1=1702;
const ull base3=998244353;
const ull base2=1000000007;
int ans=1e9;
int deg[MAX];
void dfs(int u,int ff)
{
hash[u]=0;size[u]=1;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs(v,u);size[u]+=size[v];
hash[u]^=hash[v]+base1;
}
hash[u]+=base2*size[u]+base3;
}
void Calc(int u,int ff)
{
M.insert(hash[u]);
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
ull tmp=((hash[u]-base2*n-base3)^(hash[v]+base1))+base2*(n-size[v])+base3;
hash[v]=((hash[v]-base2*size[v]-base3)^(tmp+base1))+base2*n+base3;
Calc(v,u);
}
}
void Calc2(int u,int ff)
{
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
if(deg[v]>1)
{
ull tmp=((hash[u]-base2*n-base3)^(hash[v]+base1))+base2*(n-size[v])+base3;
hash[v]=((hash[v]-base2*size[v]-base3)^(tmp+base1))+base2*n+base3;
Calc2(v,u);
}
else
{
ull tmp=((hash[u]-base2*n-base3)^(hash[v]+base1))+base2*(n-1)+base3;
if(M.count(tmp))
ans=min(ans,v);
}
}
}
int main()
{
n=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
dfs(1,0);Calc(1,0);
memset(h,0,sizeof(h));cnt=0;
for(int i=1;i<=n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
++deg[u];++deg[v];
}
for(int i=1;i<=n;++i)
if(deg[i]>1)
{
++n;dfs(i,0);Calc2(i,0);
break;
}
printf("%d\n",ans);
return 0;
}

【BZOJ4754】独特的树叶(哈希)的更多相关文章

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

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

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

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

  3. bzoj4754[JSOI2016]独特的树叶

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

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

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

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

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

  6. P4323-[JSOI2016]独特的树叶【换根dp,树哈希】

    正题 题目链接:https://www.luogu.com.cn/problem/P4323 题目大意 给出\(n\)个点的树和加上一个点之后的树(编号打乱). 求多出来的是哪个点(如果有多少个就输出 ...

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

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

  8. [JSOI2016]独特的树叶

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

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

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

随机推荐

  1. linux-ubuntu常用命令(深圳文鹏)

    系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS ...

  2. 高可用Kubernetes集群-11. 部署kube-dns

    参考文档: Github介绍:https://github.com/kubernetes/dns Github yaml文件:https://github.com/kubernetes/kuberne ...

  3. 基于marathon-lb的服务自发现与负载均衡

    参考文档: Marathon-lb介绍:https://docs.mesosphere.com/1.9/networking/marathon-lb/ 参考:http://www.cnblogs.co ...

  4. SQL判断是否存在

    判断数据库是否存在 ifexists(select*frommaster..sysdatabaseswherename=N’库名’) print’exists’ else print’notexist ...

  5. 互评Alpha版本 - Hello World团队项目空天猎

    在测评该项目时,我找到了Hello World!团队的git,并下载了相关文件以及阅读了程序运行说明. 如图所示,我下载了一个名为 SkyHunter1.0.rar 的压缩文件包,文件包内容如下: 根 ...

  6. 【探路者】团队互评Alpha版本

    [探路者]组互评连接: 1互评作品:SkyHunter http://www.cnblogs.com/zej87/p/7802000.html 2互评作品:爱阅app http://www.cnblo ...

  7. c# 修改pdf

    继续引用spire的dll. 1.代码如下: PdfDocument doc = new PdfDocument(); doc.LoadFromFile("wen.pdf"); P ...

  8. [数位DP]把枚举变成递推(未完)

    动态规划(DP)是个很玄学的东西 数位DP实际上 就是把数字上的枚举变成按位的递推 有伪代码 for i =这一位起始值 i<=这一位终止值 dp[这一位][i]+=dp[这一位-1][i]+- ...

  9. Team Work Ⅲ

    Regal-Lighting团队设计 分工思考 本次大作业我的分工定位是:Unit及子类,主要设计实现建筑类的功能. 在上一篇博客我介绍了我的继承方案和接口设定,这一篇粗略的介绍一下实现部分 Defe ...

  10. 博弈---ZOJ 2083 Win the Game(染绳子)

    原题:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2083 大意:两个人分别对n条绳子染 每次染m长 最后染不下的输,问先 ...