这是源码
#include<bits/stdc++.h>
using namespace std;
long long n;
long long fir[500005],nxt[500005],to[500005],qtop=0;//
char nn[500005];//
long long ans[500005];//
long long cun[500005];//
void add(long long x,long long y){
qtop++,nxt[qtop]=fir[x],fir[x]=qtop,to[qtop]=y;
}
void dfs(long long x,long long v,long long a,long long b,long long c,long long d){
long long pd=0;////////
long long ppd=0;//////
long long qq;////////
if(nn[x]=='('){
if(c==0)b++;//
else d++;
}
else {
if(d>0){/
d--;
if(d==0){//d==0,
c++;
v+=c;
}else{//d!=0
cun[b]=c,ppd=b;//////////////////////////
//cout<<" "<<cun[b]<<" "<<b<<endl;
b+=d;
d=0;
c=1;
v++;
}
}
else if(b>0){
b--;
c=1;
v++;
if(cun[b]!=0)v+=cun[b],c+=cun[b],pd=cun[b],cun[b]=0,qq=b;
else if(b==0){//
v+=a*c;
a+=c;
c=0;
}
}else a=0,b=0,c=0,d=0;
}
//////////////////////////////////////
ans[x]=v; /////
for(long long i=fir[x];i;i=nxt[i]){/// dfs
dfs(to[i],v,a,b,c,d); ///
} ///
/////////////////////////////////
if(pd!=0){ ///
cun[qq]=pd; ///
} //
cun[ppd]=0; ///
} ///
//////////////////////////
return ;
}
int main(){
//freopen("brackets.in","r",stdin);
//freopen("brackets.out","w",stdout);
memset(fir,0,sizeof(fir));
cin>>n;
long long fa;
for(long long i=0;i<=n;i++){
scanf("%c",&nn[i]);
}
for(long long i=2;i<=n;i++){
scanf("%lld",&fa);
add(fa,i);
}
dfs(1,0,0,0,0,0);
long long scans=ans[1];
for(long long i=2;i<=n;i++){
scans=scans^(ans[i]*i);
//cout<<ans[i]<<endl
}
cout<<scans<<endl;
}
这是翻译后
#包括<bits/stdc++.h>
使用名称空间std;
长-长n;
长杉木[500005],nxt[500005],至[500005],qtop=0//
字符nn[500005]//
龙龙安讯[500005]//
龙龙村[500005]//
空白添加(长x,长y){
qtop++,nxt[qtop]=fir[x],fir[x]=qtop,to[qtop]=y;
}
无效dfs(long long x,long long v,long long a,long long b,long long c,long long d)无效dfs{
长-长pd=0////////
长ppd=0//////
长龙qq////////
如果(nn[x]='('){
如果(c==0)b++//
其他d++;
}
其他{
如果(d>0){/
d--;
如果(d==0){//d==0,
c++语言;
v+=c+;
}否则{//d!=0
cun[b]=c,ppd=b//////////////////////////
//可<<“<<村[b]<<”<<b<<endl;
b+=d;
d=0;
c=1;
v++;
}
}
否则,如果(b>0){
b--;
c=1;
v++;
如果(村[b]!=0)v+=村[b],c+=村[b],pd=村[b],村[b]=0,qq=b;
否则如果(b==0){//c前进a
v+=交流电;
a+=c;
c=0;
}
}否则a=0,b=0,c=0,d=0;
}
//////////////////////////////////////
ans[x]=v/////
for(long long i=fir[x];i;i=nxt[i]){///dfs
dfs(至[i],v,a,b,c,d)///
} ///
/////////////////////////////////
如果(警察!=0){///
村[qq]=pd///
} //
寸[ppd]=0///
} ///
//////////////////////////
返回;
}
内部主(){
//打开(“括号.in“,”r“,标准输入法);
//弗罗恩(“方括号.out“,”w“,标准输出);
memset(fir,0,sizeof(fir));
cin>>n;
长隆发;
for(long long i=0;i<=n;i++){
scanf(“%c”,&nn[i]);
}
for(long long i=2;i<=n;i++){
scanf(“%lld”,&fa);
加(fa,i);
}
dfs(1,0,0,0,0,0);
长时间扫描=ans[1];
for(long long i=2;i<=n;i++){
scans=扫描^(ans[i]*i);
//不能
}
扫描扫描;
}