#include <bits/stdc++.h>
#define int long long
#define MAXN 1000010
using namespace std;
int n,sz[MAXN],ans;
const int m[3]={1000000009976907,89999794200117649,89999794200117649},base[3]={1000000007,299999827,999999751};
struct tree
{
int ls,rs,v;
int h1[3],h2[3];
}T[MAXN];
void dfs(int x)
{
int cnt=0;
if(T[x].ls) dfs(T[x].ls),cnt++;
if(T[x].rs) dfs(T[x].rs),cnt++;
sz[x]=sz[T[x].ls]+sz[T[x].rs]+1;
/*
int a1=T[T[x].ls].h1;
int a2=T[T[x].rs].h1;
int a3=T[T[x].ls].h2;
int a4=T[T[x].rs].h2;
*/
for(int i=0;i<3;i++)
{
T[x].h1[i]=(((T[T[x].ls].h1[i]*base[i])%m[i]+T[x].v)*base[i]%m[i]+T[T[x].rs].h1[i])%m[i];
T[x].h2[i]=(((T[T[x].rs].h2[i]*base[i])%m[i]+T[x].v)*base[i]%m[i]+T[T[x].ls].h2[i])%m[i];
}
bool flag=true;
for(int i=0;i<3;i++)
if(T[x].h1[i]!=T[x].h2[i])
{
flag=false;
break;
}
if(sz[T[x].ls]!=sz[T[x].rs]) flag=false;
if(flag) ans=max(ans,sz[x]);
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>T[i].v;
for(int i=1;i<=n;i++)
{
cin>>T[i].ls>>T[i].rs;
if(T[i].ls==-1) T[i].ls=0;
if(T[i].rs==-1) T[i].rs=0;
}
dfs(1);
cout<<ans;
return 0;
}
哈希做法,我开了三个模数和base,本来一直60pts,看了第一篇题解,把模数和base开的很大就AC了
不理解为什么不会溢出