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;
s1
是 siz[lc[x]]
,s2
是 siz[rc[x]]
。
p1
是 f[lc[x]][0]
,p2
是 f[rc[x]][1]
。
NP
,NPC
都是我设的用于哈希的数。
用自然溢出(毕竟取模又长又慢)。
时间复杂度
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;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)
· 程序员常用高效实用工具推荐,办公效率提升利器!