#include <iostream>
#include <cstdio>
using namespace std;
long long n, f[500005];//f[]记录父节点
long long ans;
int main()
{
cin >> n;
char text[500005];
for(int i = 1; i <= n; i++) cin >> text[i];//记录具体文本内容
for(int i = 2; i <= n; i++) cin >> f[i];
f[1] = 0;
for(int i = 1; i <= n; i++)//模拟
{
int now_node = i;//当前节点模拟
char ch[500005];//记录当前节点下的括号内容(注意是反向的)
int cc = 1;
ch[1] = text[now_node];
//溯源i对应路径
while(now_node != 1)
{
ch[++cc] = text[f[now_node]];
now_node = f[now_node];
}
//输出当前i对应的反向括号(测试过是正确的(大抵是))
cout << "i:" << i << ' ';
for(int j = 1; j <= cc; j++) cout << ch[j];
cout << endl;
//检查子串(倒叙从根节点检查)
int chack = 0;
char path[500005] = {0};
int cnt = 0;
for(int r = cc; r >= 1; r--)//记录路径从cc至r
{
if(r >= 4)//针对合法括号串的定义3
{
if(ch[r] == '(' && ch[r - 1] == ')' && ch[r - 2] == '(' && ch[r - 3] == ')')
chack++;
}
if(ch[r] == ')' && path[cnt] == '(')//手动栈模拟消除括号
{
chack++;
cnt--;
}
else
{
path[++cnt] = ch[r];
}
}//记录并更新答案
if(i == 1)
ans = (i * chack);
else
ans = (i * chack) ^ ans;
cout << "i:" << i << ' ' << chack << endl;
}
cout << ans;
return 0;
}
HELP!!!