括号树 一次过编译,两次ac(大雾
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10
;
int n;
vector<int> E[500050];
char str[maxn];
typedef long long ll;
ll ans[maxn];
int stk[maxn] , top;
void dfs(int u , int fa , int zzhakioi);
void ins(int val);
void dfs(int u,int fa,int zzhakioi) {
int typ,tmp;
// 没有注释毒瘤
// typ 表示是否删掉栈顶元素 或 插入一个元素,tmp 表示若删除 删掉的元素
/*
*/
// 用 ans 存 fa
// 草
// 对了
// 我们 maxn 开的 1e6
// 对
// maxn == 1e6
// 所以用 500001 ~ 1000000 存 fa
// 可以
//不愧是你
ans[u + 500000] = fa;
// Orzwkr
// [图片]
if( str[u] == '(' ) {
//orzzh
/*
typ = 2;
*/
typ = 2;
stk[++top]=u;
}
else{
// [图片]
if ( top ) {
typ = 1;
tmp = stk[top];
-- top;
ans[u] = ans[ans[tmp+500000]] + 1;
// [图片]
}
else { typ = 0; } }
for( int v : E[u] ) {
if ( v != fa ) {
dfs( v , u , zzhakioi);
}
/*orcjz
*/}
if(typ == 1) {
/*orZ*/
/*OR2*/
stk[++top]=tmp;
} else {
//cout<<"zhumlakioi"<<endl;
if( typ == 2 ) {
-- top;
}}
}
void getans(int u,int fa,ll zzhakioi) {
zzhakioi += ans[u];
ans[0] ^= 1ll * zzhakioi * u;
for ( auto v : E[u]) {
if( v == fa ) continue;
getans(v,u,zzhakioi);
}
}
int main() {
int n; cin >> n;
//orz
scanf("%s",str + 1);
for ( int i = 2;i <= n; ++ i )
{
int u;
cin >> u;
E[u].push_back(i) , E[i].push_back( u );
}
dfs( 1 , 0 , 1 );
getans( 1, 0, 0 );
cout << ans[0] << endl;
return -0; }