#include <cstdio>
#include <stack>
bool node[500001];
int fa[500001], last[500001];
unsigned long long num1[500001], num2[500001];//num1总数,num2最后连续个数
int main()
{
using namespace std;
int n;
unsigned long long ans = 0;
char chart;
scanf("%d", &n);
while ((chart = getchar()) && chart != '(' && chart != ')');
if (chart == '(') node[1] = 1;
else node[1] = 0;
for (int i = 2; i <= n; i++)
if (getchar() == '(') node[i] = 1;
else node[i] = 0;
for (int i = 2; i <= n; i++)
scanf("%d", fa + i);
if (node[1]) last[1] = 1;
for (int i = 2; i <= n; i++)
{
num1[i] = num1[fa[i]];
if (node[i])
last[i] = i;
else if (last[fa[i]])
{
num2[i] = num2[fa[last[fa[i]]]] + 1;
num1[i] = num1[fa[i]] + num2[i];
last[i] = last[fa[last[fa[i]]]];
}
ans ^= num1[i] * i;
}
printf("%llu", ans);
return 0;
}
就13行没打分号,找了一上午的bug,现在都饭点了, wdnmd 就找这?
(顺便告诫后人,f[u]<u
)