怎么这么短的代码我没看出来哪里错了。。。。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e5 + 10;
int n, a[N];
int id, head[N << 1], to[N << 1], nxt[N << 1];
ll f[N], g[N];
char s[N];
stack<int> st;
void add(int u, int v){
to[++id] = v;
nxt[id] = head[u], head[u] = id;
}
void dfs(int u, int fa){
int del = 0;
if(a[u] == 1){
if(!st.empty()){
del = st.top();
g[u] = g[del] + 1;
st.pop();
}
}
else if(a[u] == -1)
st.push(u);
f[u] = f[fa] + g[u];
for(int i=head[u];i;i=nxt[i]){
int v = to[i];
if(v == fa)
continue;
dfs(v, u);
}
if(del)
st.push(del);
else if(!st.empty())
st.pop();
}
int main(){
scanf("%d", &n);
scanf("%s", s + 1);
for(int i=1;i<=n;i++)
a[i] = (s[i] == '(' ? -1 : 1);
for(int i=2,p;i<=n;i++){
scanf("%d", &p);
add(p, i);
}
dfs(1, 1);
ll ans = 0;
for(int i=1;i<=n;i++)
ans ^= 1ll * i * f[i];
printf("%lld\n", ans);
return 0;
}