哈希炸了,悬关求调awa
查看原帖
哈希炸了,悬关求调awa
637073
wujingfey楼主2023/8/4 08:14
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=1e6+50;
ull base1=10000019,base2=10000079,n;
int ans=-1;
struct Node{
	int ls,rs,val,sz;
	ull h1,h2;//h1==h2说明对称 
}a[N];
void dfs1(int u){//左边乘base1,右边乘base2 
	if(a[u].ls==0 && a[u].rs==0){//叶子节点 
		a[u].h1=a[u].val;
		return;
	}
	if(a[u].ls!=0) dfs1(a[u].ls);
	if(a[u].rs!=0) dfs1(a[u].rs);
	a[u].h1 = a[ a[u].ls ].h1 * base1 + a[ a[u].rs ].h1 * base2 + a[u].val;
}
void dfs2(int u){//左边乘base2,右边乘base1 
	if(a[u].ls==0 && a[u].rs==0){//叶子节点 
		a[u].h2=a[u].val;
		return;
	}
	if(a[u].ls!=0) dfs2(a[u].ls);
	if(a[u].rs!=0) dfs2(a[u].rs);
	a[u].h2 = a[ a[u].ls ].h2 * base2 + a[ a[u].rs ].h2 * base1 + a[u].val;
}
void dfs3(int u){//求每个节点的子树大小 
	a[u].sz=1;
	if(a[u].ls!=0){
		dfs3(a[u].ls);
		a[u].sz+=a[ a[u].ls ].sz;
	}
	if(a[u].rs!=0){
		dfs3(a[u].rs);
		a[u].sz+=a[ a[u].rs ].sz;
	}
}
void dfs4(int u){//统计答案 
	if(a[u].h1==a[u].h2) ans=max(ans,a[u].sz);//h1==h2说明左右对称 
	if(a[u].ls!=0) dfs4(a[u].ls);
	if(a[u].rs!=0) dfs4(a[u].rs);
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i].val;
	for(int i=1;i<=n;i++) cin>>a[i].ls>>a[i].rs;
	for(int i=1;i<=n;i++){
		if(a[i].ls==-1) a[i].ls=0;//把-1改成0好操作一点 
		if(a[i].rs==-1) a[i].rs=0;
	}
	dfs1(1);
	dfs2(1);
	dfs3(1);
	dfs4(1);
	cout<<ans;
	return 0;
}
2023/8/4 08:14
加载中...