55分求调
查看原帖
55分求调
655227
Zbc20211226楼主2024/7/30 19:00
#include<bits/stdc++.h>
using namespace std;
vector<int>c[500005];
long long ans=0,x[500005],f[500005];
int n,fa,l[500005],v[500005];
string s;
void dfs(int r,int m){
	l[m]=r;
	if(m>=2){
	if(s[r]==')'&&s[l[m-1]]=='('){
		x[m]=1+x[m-2];
		if(x[m-2])v[m]=v[m-2];
		else if(s[l[m-2]]=='(')v[m]=m-2;
	}
	else if(s[r]==')'&&m>=4&&v[m-1]){
		int k=v[m-1]-1;
		x[m]=1+x[k];
		if(x[k])v[m]=v[k];
		else if(s[k]=='(')v[m]=k;
	}
	f[m]=x[m]+f[m-1];
	ans^=r*f[m];
    }
	for(int i=0,j=c[r].size();i<j;++i)dfs(c[r][i],m+1);
	v[m]=x[m]=f[m]=0;
	return;
}
int main()
{
	scanf("%d",&n);
	cin>>s;
	s="0"+s;
	for(int i=2;i<=n;++i){
		scanf("%d",&fa);
		c[fa].push_back(i);
	}
	dfs(1,1);
	printf("%lld",ans);
	return 0;
}
2024/7/30 19:00
加载中...