用哈希表判断对称二叉树,结果 WA 了 3 个点。加了多重哈希也没有用,是不是写的不好
#include<bits/stdc++.h>
// 一些随便找的质数
#define p1 167772161ull
#define p2 469762049ull
#define p3 754974721ull
#define p4 998244353ull
#define p5 1004535809ull
#define p6 1222827239ull
#define p7 1610612741ull
#define p8 3221225473ull
#define p9 4294967291ull
using namespace std;
typedef unsigned long long ull;
int n,v[1000005],l[1000005],r[1000005],size[1000005];
ull h[1000005],hinv[1000005];
ull h2[1000005],h2inv[1000005];
ull h3[1000005],h3inv[1000005];
int read() {
char c=getchar();
int n=0,f=1;
while(c<48) {
if(c == '-') f=-1;
c=getchar();
}
while(c>47) n=n*10+(c^48), c=getchar();
return n*f;
}
void dfs(int rt) {
size[rt]=1;
h[rt]=hinv[rt]=v[rt]*p3;
h2[rt]=h2inv[rt]=v[rt]*p6;
h3[rt]=h3inv[rt]=v[rt]*p9;
if(~l[rt]) {
dfs(l[rt]);
size[rt]+=size[l[rt]];
h[rt]+=h[l[rt]]*p1;
hinv[rt]+=hinv[l[rt]]*p2;
h2[rt]+=h2[l[rt]]*p4;
h2inv[rt]+=h2inv[l[rt]]*p5;
h3[rt]+=h3[l[rt]]*p7;
h3inv[rt]+=h3inv[l[rt]]*p8;
}
if(~r[rt]) {
dfs(r[rt]);
size[rt]+=size[r[rt]];
h[rt]+=h[r[rt]]*p2;
hinv[rt]+=hinv[r[rt]]*p1;
h2[rt]+=h2[r[rt]]*p5;
h2inv[rt]+=h2inv[r[rt]]*p4;
h3[rt]+=h3[r[rt]]*p8;
h3inv[rt]+=h3inv[r[rt]]*p7;
}
}
int main() {
n=read();
for(int i=1; i<=n; i++) v[i]=read();
for(int i=1; i<=n; i++) l[i]=read(), r[i]=read();
dfs(1);
int ans=1;
for(int i=1; i<=n; i++)
if(h[l[i]] == hinv[r[i]] && h2[l[i]] == h2inv[r[i]] && h3[l[i]] == h3inv[r[i]])
ans = max(ans,size[i]);
cout<<ans;
}