对中序遍历,双哈希做法。
我会关注帮我解决问题的人。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=998244353,mod2=1e9+7;
const int maxn=1e6+5;
int n;
int v[maxn];
struct Tree
{
int ls,rs;
}tree[maxn];
ll pow10[maxn],pow10_2[maxn];// 10 的 n 次方
ll hash1[maxn],hash3[maxn];
int size[maxn];
void dfs(int node)
{
if(node==-1)return;
dfs(tree[node].ls);
if(tree[node].ls!=-1)
{
hash1[node]=hash1[tree[node].ls]*10ll+(ll)v[node];
hash1[node]%=mod;
hash3[node]=hash3[tree[node].ls]*10ll+(ll)v[node];
hash3[node]%=mod2;
}
else
{
hash1[node]=v[node];
hash3[node]=v[node];
}
dfs(tree[node].rs);
hash1[node]=hash1[node]*pow10[size[tree[node].rs]]+hash1[tree[node].rs];
hash1[node]%=mod;
hash3[node]=hash3[node]*pow10_2[size[tree[node].rs]]+hash3[tree[node].rs];
hash3[node]%=mod2;
}
ll hash2[maxn],hash4[maxn];
void dfs2(int node)
{
if(node==-1)return;
dfs2(tree[node].rs);
if(tree[node].rs!=-1)
{
hash2[node]=hash2[tree[node].rs]*10ll+(ll)v[node];
hash2[node]%=mod;
hash4[node]=hash4[tree[node].rs]*10ll+(ll)v[node];
hash4[node]%=mod;
}
else
{
hash2[node]=v[node];
hash4[node]=v[node];
}
dfs2(tree[node].ls);
hash2[node]=hash2[node]*pow10[size[tree[node].ls]]+hash2[tree[node].ls];
hash2[node]%=mod;
hash4[node]=hash4[node]*pow10_2[size[tree[node].ls]]+hash4[tree[node].ls];
hash4[node]%=mod;
}
void dfs3(int node)
{
if(node==-1)return;
size[node]=1;
dfs3(tree[node].ls);
dfs3(tree[node].rs);
if(tree[node].ls!=-1)
size[node]+=size[tree[node].ls];
if(tree[node].rs!=-1)
size[node]+=size[tree[node].rs];
}
int ans=0;
void dfs4(int node)
{
if(node==-1)return;
if(size[tree[node].ls]==size[tree[node].rs])
{
if(tree[node].ls!=-1&&tree[node].rs!=-1)
{
if(hash1[tree[node].ls]==hash2[tree[node].rs]&&hash3[tree[node].ls]==hash4[tree[node].rs])
{
ans=max(ans,size[node]);
}
}
if(tree[node].ls==-1&&tree[node].rs==-1)
{
ans=max(ans,1);
}
}
dfs4(tree[node].ls);
dfs4(tree[node].rs);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&v[i]);
}
for(int i=1;i<=n;i++)
{
scanf("%d%d",&tree[i].ls,&tree[i].rs);
}
pow10[0]=1;
for(int i=1;i<=n;i++)
{
pow10[i]=pow10[i-1]*10ll%mod;
}
pow10_2[0]=1;
for(int i=1;i<=n;i++)
{
pow10_2[i]=pow10_2[i-1]*10ll%mod2;
}
dfs3(1);
dfs(1);
dfs2(1);
dfs4(1);
printf("%d",ans);
return 0;
}