题解
2023-08-19 16:33:13
发布于:广东
3阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
const int mod=1e8;
int n,m;
int f1[maxn],cnt=-1;
struct node{
int data,next;
} p[maxn<<1];
void addline(int x,int y){
p[++cnt]=(node){y,f1[x]};
f1[x]=cnt;
}
char s[maxn];
long long val[maxn],ans[maxn],res;
int f2[maxn];
int giegie[maxn],top;
void dfs(int x){
int pl=0;
ans[x]=ans[f2[x]];
if(s[x]=='(') giegie[++top]=x;
else if(top){
pl=giegie[top--];
val[x]=val[f2[pl]]+1;
ans[x]+=val[x];
}
res^=1ll*x*ans[x];
for(int i=f1[x];~i;i=p[i].next){
int to=p[i].data;
dfs(to);
}
if(s[x]=='(') top--;
else if(pl) giegie[++top]=pl;
}
int main(){
memset(f1,-1,sizeof(f1));
cin>>n>>s+1;
for(int i=2;i<=n;i++){
cin>>f2[i];
addline(f2[i],i);
}
dfs(1);
cout<<res;
}
giegie~
这里空空如也
有帮助,赞一个