树哈希,顺便问一下还有没有人用树哈希也得过76,给点经验?谢谢!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<utility>
#include<queue>
#include<map>
#define lc tr[x][0]
#define rc tr[x][1]
#define ull unsigned long long
using namespace std;
const int N=1e6+10;
const ull M=4508375473295257248,M1=412037123471,X[2]={1423841,2484533};
int n,tr[N][2],f[N],ans;
ull w[N],h1[N],h2[N],h3[N];
void dfs(int x,int depth,int now){
f[x]=1;
h1[x]=w[x]*((ull)depth+M1)*M1;
h2[x]=w[x]*X[1-now];h3[x]=w[x]*X[now];
for(int i=0;i<2;i++){
int j=tr[x][i];
if(j==-1) continue;
dfs(j,depth+1,i);
f[x]+=f[j];
}
if(lc!=-1&&rc!=-1&&h1[lc]==h1[rc]&&h2[lc]==h3[rc]) ans=max(ans,f[x]);
if(lc!=-1) h1[x]+=h1[lc],h2[x]+=h2[lc],h3[x]+=h3[lc];
if(rc!=-1) h1[x]+=h1[rc],h2[x]+=h2[rc],h3[x]+=h3[rc];
h1[x]*=M;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++){
int x,y;
scanf("%d%d",&x,&y);
tr[i][0]=x;tr[i][1]=y;
}
ans=1;
dfs(1,1,1);
printf("%d",ans);
return 0;
}