正题

题目链接:https://www.luogu.com.cn/problem/P4323


题目大意

给出\(n\)个点的树和加上一个点之后的树(编号打乱)。

求多出来的是哪个点(如果有多少个就输出编号最小的)。

\(1\leq n\leq 10^5\)


解题思路

定义一下\(hash\)值\(P(i)\)

我的做法是\(P(i)=p^i\),\(p\)是一个质数,当然这样好像容易被卡,安全点的做法是用第\(i\)个质数或者直接用复数\(hash\)。

然后定义一下带根的\(hash\)值

\[f_x=\sum_{y\in son_x}f_y\times P(siz_y)
\]

然后换根求出两棵树里面所有点作为根的\(hash\)值,第一棵树里的丢进\(map\)。然后第二棵树里面枚举一下叶子然后算一下去掉之后的\(hash\)值在\(map\)里面匹配(1号点要特判)

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define ll long long
using namespace std;
const ll N=1e5+10,P=998244353,p=133331;
vector<ll> T[N],G[N];map<ll,bool>mp;
ll n,siz[N],pw[N],f[N],g[N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
void Dfs1(ll x,ll fa,vector<ll> *T){
siz[x]=f[x]=1;
for(ll i=0;i<T[x].size();i++){
ll y=T[x][i];
if(y==fa)continue;
Dfs1(y,x,T);siz[x]+=siz[y];
(f[x]+=f[y]*pw[siz[y]]%P)%=P;
}
return;
}
void Dfs2(ll x,ll fa,vector<ll> *T){
for(ll i=0;i<T[x].size();i++){
ll y=T[x][i];
if(y==fa)continue;
g[y]=(g[x]-f[y]*pw[siz[y]]%P+P)%P;
(g[y]=f[y]+g[y]*pw[siz[1]-siz[y]]%P)%=P;
Dfs2(y,x,T);
}
return;
}
signed main()
{
scanf("%lld",&n);pw[0]=1;
for(ll i=1;i<=n+1;i++)
pw[i]=pw[i-1]*p%P;
for(ll i=1;i<n;i++){
ll x,y;
scanf("%lld%lld",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
for(ll i=1;i<=n;i++){
ll x,y;
scanf("%lld%lld",&x,&y);
T[x].push_back(y);
T[y].push_back(x);
}
Dfs1(1,1,G);g[1]=f[1];Dfs2(1,1,G);
for(ll i=1;i<=n;i++)mp[g[i]]=1; Dfs1(1,1,T);g[1]=f[1];
Dfs2(1,1,T);
if(T[1].size()<=1){
ll y=T[1][0];
if(mp[f[y]])
{puts("1");return 0;}
}
for(ll x=2;x<=n+1;x++){
if(T[x].size()>1)continue;
ll y=T[x][0];
ll tmp=(g[y]-pw[1]+P)%P;
if(mp[tmp]){printf("%lld\n",x);return 0;}
}
return 0;
}

P4323-[JSOI2016]独特的树叶【换根dp,树哈希】的更多相关文章

  1. 换根DP+树的直径【洛谷P3761】 [TJOI2017]城市

    P3761 [TJOI2017]城市 题目描述 从加里敦大学城市规划专业毕业的小明来到了一个地区城市规划局工作.这个地区一共有ri座城市,<-1条高速公路,保证了任意两运城市之间都可以通过高速公 ...

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

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

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

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

  4. [BZOJ4379][POI2015]Modernizacja autostrady[树的直径+换根dp]

    题意 给定一棵 \(n\) 个节点的树,可以断掉一条边再连接任意两个点,询问新构成的树的直径的最小和最大值. \(n\leq 5\times 10^5\) . 分析 记断掉一条边之后两棵树的直径为 \ ...

  5. 2018.10.15 NOIP训练 水流成河(换根dp)

    传送门 换根dp入门题. 貌似李煜东的书上讲过? 不记得了. 先推出以1为根时的答案. 然后考虑向儿子转移. 我们记f[p]f[p]f[p]表示原树中以ppp为根的子树的答案. g[p]g[p]g[p ...

  6. [JSOI2016]独特的树叶

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

  7. 小奇的仓库:换根dp

    一道很好的换根dp题.考场上现场yy十分愉快 给定树,求每个点的到其它所有点的距离异或上m之后的值,n=100000,m<=16 只能线性复杂度求解,m又小得奇怪.或者带一个log像kx一样打一 ...

  8. 国家集训队 Crash 的文明世界(第二类斯特林数+换根dp)

    题意 ​ 题目链接:https://www.luogu.org/problem/P4827 ​ 给定一棵 \(n\) 个节点的树和一个常数 \(k\) ,对于树上的每一个节点 \(i\) ,求出 \( ...

  9. Acesrc and Travel(2019年杭电多校第八场06+HDU6662+换根dp)

    题目链接 传送门 题意 两个绝顶聪明的人在树上玩博弈,规则是轮流选择下一个要到达的点,每达到一个点时,先手和后手分别获得\(a_i,b_i\)(到达这个点时两个人都会获得)的权值,已经经过的点无法再次 ...

随机推荐

  1. 无法加载文件 E:\PROGRAM FILES\NODEJS\NODE_GLOBAL\yarn.ps1,因为在此系统中禁止执行脚本

    参考: npm : 无法加载文件 C:\Program Files\nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本.

  2. Android中Context解析

    Context概念 当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context. Context是一个抽象基类,我们通过它访问当前包的资源(getResources.getA ...

  3. rasa 如何写一个故事

    设计故事 在设计故事时,需要考虑两组对话交互:快乐路径和不快乐路径.快乐路径描述用户何时按照您的预期遵循对话流程,并在出现提示时始终提供必要的信息.然而,用户经常会因为问题.闲聊或其他问题而偏离愉快的 ...

  4. GO的GC辣鸡回收(一)

    用户程序通过内存分配器(Allocator)在堆上申请内存,而垃圾收集器(Collector)负责回收堆上的内存空间,内存分配器和垃圾收集器共同管理程序中的堆内存空间. 基本概念 垃圾分类 语义垃圾: ...

  5. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  6. Django使用tinymce富文本编辑器

    1 - 安装 pip install django-tinymce==2.6.0 2 - 注册app INSTALLED_APPS = ( ... 'tinymce', ) 3 - 在setting中 ...

  7. python实现遥感图像阈值分割

    1.阈值分割 import os import cv2 import numpy as np import matplotlib.pyplot as plt from osgeo import gda ...

  8. 20210720 noip21

    又是原题,写下题解吧 Median 首先时限有 2s(学校评测机太烂,加到 4s 了),可以放心地筛 \(1e7\) 个质数并算出 \(s_2\),然后问题变为类似滑动求中位数.发现 \(s_2\) ...

  9. GoLang设计模式06 - 对象池模式

    这次介绍最后一个创建型模式--对象池模式.顾名思义,对象池模式就是预先初始化创建好多个对象,并将之保存在一个池子里.当需要的时候,客户端就可以从池子里申请一个对象使用,使用完以后再将之放回到池子里.池 ...

  10. Winform EF CodeFist方式连接数据库

    直接生成ado.net 实体数据模型挺方便的,但只有一步步的手写代码才能更好的理解EF,在学习asp.net core过程中手写代码已经明白了怎么回事,但实现过程有些麻烦不知道如何记录,但Winfor ...