hash炸了
查看原帖
hash炸了
914335
xiongmy123楼主2023/7/31 04:27
#include <bits/stdc++.h>
using namespace std;
const int MN=1e6+5;
int w[MN],l[MN],r[MN],H1[MN],H2[MN],S1[MN],S2[MN],s1,s2,l1[MN],r1[MN],l2[MN],r2[MN];
int p[MN],D[MN];
const int base=13331;
void dfs1(int u){
	if(u==-1)S1[++s1]=0;
	else{
		D[u]=1;
		S1[++s1]=w[u];
		l1[u]=s1;
		dfs1(l[u]);
		dfs1(r[u]);
		r1[u]=s1;
		if(l[u]!=-1){D[u]+=D[l[u]];}
        if(r[u]!=-1){D[u]+=D[r[u]];}
	}
}
void dfs2(int u){
	if(u==-1)S2[++s2]=0;
	else{
		S2[++s2]=w[u];
		l2[u]=s2;
		dfs2(r[u]);
		dfs2(l[u]);
		r2[u]=s2;
	}
}
int get_hash1(int r,int l){
	int h=H1[r]-H1[l-1]*p[r-l+1];
	return h;
}
int get_hash2(int r,int l){
	int h=H2[r]-H2[l-1]*p[r-l+1];
	return h; 
}
int main(){
	int n,ans=0;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>w[i];
	for(int i=1;i<=n;i++)cin>>l[i]>>r[i];
	dfs1(1);
	dfs2(1);
	p[0]=1;
	for(int i=1;i<=s1;i++)p[i]=base*p[i-1];
	for(int i=1;i<=s1;i++)H1[i]=H1[i-1]*base+S1[i];
	for(int i=1;i<=s2;i++)H2[i]=H2[i-1]*base+S2[i];
	for(int i=1;i<=n;i++){
		int p=get_hash1(l1[i],r1[i]);
		int q=get_hash2(l2[i],r2[i]);
		if(p==q){
			ans=max(ans,D[i]);
		}
	}
	cout<<ans;
	return 0;
}
2023/7/31 04:27
加载中...