85pts求调
查看原帖
85pts求调
1386960
one_of_the_person楼主2024/10/15 07:54
#include<bits/stdc++.h>
using namespace std;
unsigned long long const N=5e5+5;
unsigned long long n,s[N]={},f[N]={},top=0,ls[N]={},sum[N]={},ans=0,last[N]={},next1[N]={},to[N]={};
char a[N]={};
void dfs(unsigned long long x){
    unsigned long long tem=0;
    if(a[x]==')'&&top>0){
        tem=s[top];
        ls[x]=ls[f[tem]]+1;
        top--;
    }
    else if(a[x]=='('){
        s[++top]=x;
    }
    sum[x]=sum[f[x]]+ls[x];
    if(next1[x]>0)dfs(next1[x]);
    if(to[x]>0)dfs(to[x]);
    if(tem!=0)s[++top]=tem;
    else if(top)top--;
    return;
}
int main(){
    cin>>n;
    for(unsigned long long i=1;i<=n;i++)cin>>a[i];
    for(unsigned long long i=2;i<=n;i++){
        cin>>f[i];
        if(next1[f[i]]==0)next1[f[i]]=i,last[f[i]]=i;
        else to[last[f[i]]]=i,last[f[i]]=i;
    }
    dfs(1);
    for(unsigned long long i=1;i<=n;i++)ans^=i*sum[i];
    cout<<ans;
    return 0;
}
2024/10/15 07:54
加载中...