求(骇死我力
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
long long max(long long a,long long b){
return a>b?a:b;
}
long long min(long long a,long long b){
return a<b?a:b;
}
long long read(){
long long x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-'){
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<1)+(x<<3)+(c^'0');
c=getchar();
}
return x*f;
}
void write(long long x){
if(x<0){
putchar('-');
x=-x;
}
if(x>9){
write(x/10);
}
putchar(x%10+'0');
return;
}
long long n,i,j,f[500001],sum[500001],ls[500001],ans;
vector<long long> to[500001];
stack<int> q;
char c[500001];
void dfs(long long x){
int tmp=0;
if(c[x]==')'){
if(!q.empty()){
tmp=q.top();
q.pop();
ls[x]=ls[f[tmp]]+1;
}
}
else if(c[x]=='('){
q.push(x);
}
sum[x]=sum[f[x]]+ls[x];
int j;
for(auto j:to[x]){
dfs(j);
}
if(tmp){
q.push(tmp);
}
else if(!q.empty()){
q.pop();
}
}
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read();
for(i=1;i<=n;i++){
scanf("%c",&c[i]);
}
for(i=2;i<=n;i++){
f[i]=read();
to[f[i]].push_back(i);
}
dfs(1);
for(i=1;i<=n;i++){
ans^=i*sum[i];
}
write(ans);
return 0;
}
我在本地测第二三个样例都没过,交一发直接A?