自己想的思路, 代码如下
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
#define int long long
const int N = 5e5+10;
int n, val[N], num[N], cnt[N], tot[N], lft[N];
stack<int> stk;
vector<int> g[N];
void dfs(int u, int p) {
if(val[u] == 0) {
stk.push(u);
if(val[p] and stk.size() == tot[lft[p]]) cnt[u] = cnt[lft[p]] + 1;
else cnt[u] = 0;
tot[u] = stk.size();
} else if(!stk.empty()) {
int v = stk.top();
stk.pop();
lft[u] = v;
num[u] = cnt[v] + 1;
}
for(int v : g[u]) if(v != p) {
dfs(v, u);
}
if(!stk.empty() and stk.top() == u) stk.pop();
}
int ans;
void getans(int u, int p, int s) {
s += num[u];
ans ^= u*s;
for(int v : g[u]) if(v != p) {
getans(v, u, s);
}
}
main() {
cin>>n;
for(int i=1;i<=n;++i) {
char c;
cin>>c;
if(c == '(') val[i] = 0;
else val[i] = 1;
}
for(int i=2;i<=n;++i) {
int x;
cin>>x;
g[x].push_back(i);
}
dfs(1, 0);
getans(1, 0, 0);
cout<<ans;
return 0;
}