题目:https://www.luogu.com.cn/problem/P5658
#include <bits/stdc++.h>
#define ll long long
#define R register
#define rep(i, x, n) for(R int i = x; i <= n; i = -~i)
#define Rep(i, a, b, c) for(R int i = a; i <= b; i += c)
#define endl "\n"
#define spa printf(" ")
#define fop(x) freopen(#x".in", "r", stdin);freopen(#x".out", "w", stdout);
#define endl "\n"
#define Yesn puts("Yes")
#define Yes printf("Yes")
#define Non puts("No")
#define No printf("No")
#define YESn puts("YES")
#define YES printf("YES")
#define NOn puts("NO")
#define NO printf("NO")
#define inf 2e18
#define pt printf
#define sf scanf
#define sd "%d"
#define sld "%lld"
#define db double
using namespace std;
void fre() {
#ifdef ONLINE_JUDGE
fop(brackets);
#endif
}
const int Arr_Max_size = 500005;
//using namespace Fast;
/*
----------------------------------
This is main code
----------------------------------
*/
int nxt[Arr_Max_size], to[Arr_Max_size], head[Arr_Max_size], cnt;
ll N, ans, f[Arr_Max_size];
ll p[Arr_Max_size], ls[Arr_Max_size], cnnt, sum[Arr_Max_size];
string s;
void add(int u, int v) {
nxt[++ cnt] = head[u];
to[cnt] = v;
head[u] = cnt;
}
void Dfs(int x) {
if(s[x] == ')') {
if(cnnt != 0) {
p[x] = p[f[ls[cnnt]]] + 1;
-- cnnt;
}
} else if(s[x] == '(') ls[++ cnnt] = x;
sum[x] = sum[f[x]] + p[x];
for(int i = head[x]; i != 0; i = nxt[i]) {
Dfs(to[i]);
}
int xx = ls[cnnt];
ls[++ cnnt] = xx;
}
void solve() {
cin >> N;
cin >> s;
s = " " + s;
rep(i, 2, N) {
int x;
cin >> x;
add(x, i);
f[i] = x;
}
Dfs(1);
rep(i, 1, N) {
ans = ans ^ (sum[i] * (ll)i);
}
cout << ans;
}
int main() {
fre();
solve();
return 0;
}