正题

题目链接: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. Java的GUI组件的布局管理器

    1 import java.awt.BorderLayout; 2 import java.awt.FlowLayout; 3 import java.awt.Font; 4 import java. ...

  2. Linkerd 2.10(Step by Step)—控制平面调试端点

    Linkerd 2.10 系列 快速上手 Linkerd v2 Service Mesh(服务网格) 腾讯云 K8S 集群实战 Service Mesh-Linkerd2 & Traefik2 ...

  3. OKR工作法读后感

    <OKR工作法>把管理思想融入到一则创业故事中,故事细节经过了精心的设计,融入了管理智慧和踩坑填坑经验,每个细节都以小见大,耐人寻味.一千个读者,就有一千个哈姆雷特. 所以这次我不去点评大 ...

  4. 每天迁移MySQL历史数据到历史库Python脚本

    #!/usr/bin/env python # coding:utf-8 #__author__ = 'Logan'      import MySQLdb import sys import dat ...

  5. linux centos7 模拟垃圾回收站功能以及 crontab 定时任务的设置

    2021-08-04 1. 安装 环境:CentOS Linux release 7.5.1804 (Core) # 将 saferm.sh 拷贝到 /bin 目录下面 git clone git:/ ...

  6. docker开启remote-api 2375端口后,Failed to start Docker Application Container Engine,重启docker失败的问题解决

    1.  按照网上的教程修改了 /usr/lib/systemd/system/docerk.service配置后,重启失败.修改/etc/docker/daemon.json 增加hosts后重启也是 ...

  7. Qt中的Q_PROPERTY宏浅析

    1. Q_PROPERTY Qt提供了一个绝妙的属性系统,Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObj ...

  8. OAuth2-简介

    1. 简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用.因此OAUTH是安全的. ...

  9. webservice学习总结(一)-- WebService相关概念介绍

    一.WebService是什么? 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 一个跨语言.跨平台的规范(抽象) 多个跨平台.跨语言的应用间通信整合的方案(实际) 二.为什么要用 ...

  10. Identity角色管理三(创建角色)

    首先创建视图模型 using System.ComponentModel; using System.ComponentModel.DataAnnotations; namespace Shop.Vi ...