感觉已经和题解写的差不多了......但只拿了85 pts
求大佬答疑qwq
#include<cstdio>
#include<vector>
#define ll long long
using namespace std;
int n;
vector<int> tree[500020];
char kh[500020];
int stack[500020],cnt,fa[500020];
ll sum[500020],ans[500020];
void dfs(ll x,ll cnt_1){
int pd=0;
ans[x] = cnt_1;
if(kh[x] == '(') pd=1,stack[++cnt] = x;
else if(cnt){
pd=2;
sum[x] = sum[fa[stack[cnt]]] + 1;
cnt--;
}
ans[x] += sum[x];
for(int i=0;i<tree[x].size();i++){
dfs(tree[x][i],ans[x]);
}
if(pd==1) cnt--;
if(pd==2) cnt++;
return;
}
int read(){
int num=0;
char c=getchar();
while(c<'0'||c>'9') c=getchar();
while('0'<=c&&c<='9') num=num*10+c-'0',c=getchar();
return num;
}
int main(){
n=read();
scanf("%s",kh+1);
for(int i=2;i<=n;i++){
int a=read();
tree[a].push_back(i);
fa[i] = a;
}
dfs(1,0);
ll fnalans=0;
for(int i=1;i<=n;i++){
// sum[i] += sum[i-1];
fnalans^=1ll*i*ans[i];
// printf("%d ",ans[i]);
}
printf("%lld",fnalans);
return 0;
}