题目分析
- emmm…NOIP2020 考完后在写
- 要用栈
- 考完了,然而思路忘的一干二净 ——2021.1.29
- 好了,话不多说
明明说了好多 ,我犯懒了,自己看代码吧
代码
#include<bits/stdc++.h>
using namespace std;
int n,f[500001],sum1,sum2,l[500001];
long long ans,sum[500001],dis[500001];
char a[500001];
vector<int>s[500001];
inline int read(){
int k=0,k1=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') k1=-1;
ch=getchar();
}
while(isdigit(ch)){
k=(k<<3)+(k<<1)+(ch^48);
ch=getchar();
}
return k*k1;
}
inline void jqsh(int t){
int q=sum1,o=0;
if(a[t]=='(') l[++sum1]=t;
else if(sum1&&a[t]==')'){
o=l[sum1];
dis[t]=dis[f[o]]+1;
sum1--;
}
sum[t]=sum[f[t]]+dis[t];
for(int i=0;i<s[t].size();i++)
jqsh(s[t][i]);
sum1=q;
if(o) l[sum1]=o;
return;
}
int main(){
n=read();
scanf("%s",a+1);
f[1]=1;
for(int i=2;i<=n;i++){
f[i]=read();
s[f[i]].push_back(i);
}
jqsh(1);
for(long long i=1;i<=n;i++)
ans=ans^(i*sum[i]);
printf("%lld\n",ans);
return 0;
}