【BZOJ4754】独特的树叶(哈希)
【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】独特的树叶(哈希)的更多相关文章
- BZOJ4754 JSOI2016独特的树叶(哈希)
判断两棵无根树是否同构只需要把重心提作根哈希即可.由于只添加了一个叶子,重心的位置几乎不发生偏移,所以直接把两棵树的重心提起来,逐层找哈希值不同且对应的两子树即可.被一个普及组子问题卡一年. #inc ...
- BZOJ 4754 [JSOI2016]独特的树叶 | 树哈希判同构
题目链接 这道题是一道判断无根树同构的模板题,判断同构主要的思路就是哈希. 一遇到哈希题,一百个人能有一百零一种哈希方式,这篇题解随便选用了一种--类似杨弋<Hash在信息学竞赛中的一类应用&g ...
- bzoj4754[JSOI2016]独特的树叶
这个题....别人写得怎么都....那么短啊? 我怎么....WA了好几次啊....怎么去loj扒了数据才调出来啊? 这个算法...怎么我还是不知道对不对啊 怎么回事啊怎么回事啊怎么回事啊? 请无视上 ...
- BZOJ4754 & 洛谷4323 & LOJ2072:[JSOI2016]独特的树叶——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4754 https://www.luogu.org/problemnew/show/P4323 ht ...
- P4323 [JSOI2016]独特的树叶(树哈希)
传送门 树哈希?->这里 反正大概就是乱搞--的吧-- //minamoto #include<bits/stdc++.h> #define R register #define l ...
- P4323-[JSOI2016]独特的树叶【换根dp,树哈希】
正题 题目链接:https://www.luogu.com.cn/problem/P4323 题目大意 给出\(n\)个点的树和加上一个点之后的树(编号打乱). 求多出来的是哪个点(如果有多少个就输出 ...
- Luogu 4323 [JSOI2016]独特的树叶
新技能get 树哈希,考虑到两棵树相同的条件,把每一个结点的哈希值和树的siz写进哈希值里去. 做出A树每一个结点为根时的树的哈希值丢进set中,然后暴力枚举B树中度数为1的点,求出删掉这个点之后的哈 ...
- [JSOI2016]独特的树叶
https://zybuluo.com/ysner/note/1177340 题面 有一颗大小为\(n\)的树\(A\),现加上一个节点并打乱编号,形成树\(B\),询问加上的节点最后编号是多少? \ ...
- Luogu P4323 [JSOI2016]独特的树叶
一道比较好的树Hash的题目,提供一种不一样的Hash方法. 首先无根树的同构判断一般的做法只有树Hash,所以不会的同学可以做了Luogu P5043 [模板]树同构([BJOI2015]树的同构) ...
随机推荐
- Spark优化一则 - 减少Shuffle
Spark优化一则 - 减少Shuffle 看了Spark Summit 2014的A Deeper Understanding of Spark Internals,视频(要***)详细讲解了Spa ...
- sql server 按月对数据表进行分区
当某张数据表数据量较大时,我们就需要对该表进行分区处理,以下sql语句,会将数据表按月份,分为12个分区表存储数据,废话不多说,直接上脚本: use [SIT_L_TMS] --开启 XP_CMDSH ...
- hbase和ZooKeeper集群安装配置
一:ZooKeeper集群安装配置 1:解压zookeeper-3.3.2.tar.gz并重命名为zookeeper. 2:进入~/zookeeper/conf目录: 拷贝zoo_sample.cfg ...
- 排查GCC 4.4.X版本优化switch-enum的BUG
起因 一次偶然碰到一个诡异的bug,现象是同一份C++代码使用GCC4.4.x版本在开启优化前和优化后的结果不一样,优化后的代码逻辑不正确. 示例代码如下: //main.cpp #include & ...
- python2和python3同时存在如何安装和使用pip
linux下 如果没有pip则需要安装pip python2安装pip sudo apt install python-pip1如果是python3,则如下: sudo apt install pyt ...
- PytorchZerotoAll学习笔记(五)--逻辑回归
逻辑回归: 本章内容主要讲述简单的逻辑回归:这个可以归纳为二分类的问题. 逻辑,非假即真.两种可能,我们可以联想一下在继电器控制的电信号(0 or 1) 举个栗子:比如说你花了好几个星期复习的考试(通 ...
- Spring Task中的定时任务无法注入service的解决办法
1.问题 因一个项目(使用的是Spring+SpringMVC+hibernate框架)需要在spring task定时任务中调用数据库操作,在使用 @Autowired注入service时后台报错, ...
- os模块大全详情
python常用模块目录 一:os模块分类: python os.walk详解 二:os模块大全表 序号 方法 方法 1 os.access(path, mode) 检验权限模式 2 os.chdir ...
- [C++] Solve "No source available for main()" error when debugging on Eclipse
In Mac, the issue image: 1. A existing cmake project on disk 2. import this project into Eclipse. 3 ...
- Python3【基础】-表达式与运算符
一.什么是表达式? 1+2*3就是一个表达式,这里的加号和乘号叫做运算符,1.2.3叫做操作数.1+2*3计算的结果是7,计算结果可以存到一个变量中,即:res = 1 + 2 * 3. 所谓的表达式 ...