AcWing 476. 对称二叉树

树哈希解法

  • f[x][0] 为 : x 的子树都严格按照先左后右的顺序 Hash 的值。
  • f[x][1] 先右后左。

判断 x 是不是对称的二叉树只要判断 f[lc[x]][0]f[rc[x]][1] 是否相等。
递推式:

copy
f[x][0]=p1*s1*P+a[x]*NP+((~rc[x]) ? f[rc[x]][0] : 997)*NPC*d2; f[x][1]=p2*s2*P+a[x]*NP+((~lc[x]) ? f[lc[x]][1] : 997)*NPC*d1;

s1siz[lc[x]],s2siz[rc[x]]
p1f[lc[x]][0],p2f[rc[x]][1]
NP,NPC 都是我设的用于哈希的数。
用自然溢出(毕竟取模又长又慢)。

时间复杂度

O(n)

Code

copy
#include<set> #include<map> #include<queue> #include<stack> #include<ctime> #include<cmath> #include<bitset> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; typedef unsigned long long ULL; const int N=1e6+5; const ULL P=233333,NP=144177; ULL NPC; int n; ULL a[N],f[N][2]; int lc[N],rc[N],siz[N]; int dep[N],h; int ans; void Dp(int x) { ULL p1=0,p2=0; int s1=0,s2=0,d1=0,d2=0; if(~lc[x]) Dp(lc[x]),p1=f[lc[x]][0],s1=siz[lc[x]],d1=dep[lc[x]]; if(~rc[x]) Dp(rc[x]),p2=f[rc[x]][1],s2=siz[rc[x]],d2=dep[rc[x]]; if(p1==p2&&s1==s2&&d1==d2) ans=max(ans,siz[x]); f[x][0]=p1*s1*P+a[x]*NP+((~rc[x]) ? f[rc[x]][0] : 997)*NPC*d2; f[x][1]=p2*s2*P+a[x]*NP+((~lc[x]) ? f[lc[x]][1] : 997)*NPC*d1; // printf("%d : %llu %llu\n",x,f[x][0],f[x][1]); } void dfs1(int x,int fa) { dep[x]=dep[fa]+1; h=max(h,dep[x]); siz[x]=1; if(~lc[x]) dfs1(lc[x],x),siz[x]+=siz[lc[x]]; if(~rc[x]) dfs1(rc[x],x),siz[x]+=siz[rc[x]]; } int main() { // freopen("1.in","r",stdin); int i; srand((unsigned)time(0)); NPC=(LL)rand()*rand(); scanf("%d",&n); for(i=1;i<=n;i++) scanf("%llu",&a[i]); for(i=1;i<=n;i++) scanf("%d%d",&lc[i],&rc[i]); dfs1(1,0); Dp(1); cout<<ans<<endl; return 0; }
posted @   cjlworld  阅读(62)  评论(0编辑  收藏  举报
编辑推荐:
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起