比赛 EYOI常规赛 4th 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 括号树 最终得分 100
用户昵称 冷月星云 运行时间 0.359 s
代码语言 C++ 内存使用 14.32 MiB
提交时间 2022-05-29 09:04:52
显示代码纯文本
#include <bits/stdc++.h>
#define R register 
#define ull unsigned long long
#define ll long long

using namespace std;

int read(){
    R int x = 0, f = 1;
    R char ch = getchar();
    while(ch > '9' || ch < '0')
    {
        if(ch == '-')
            f = -1;
        ch = getchar();
    }
    while(ch >= '0' && ch <= '9')
    {
        x = x*10 + ch-'0';
        ch = getchar();
    }
    return x*f;
}

ll n, head[500010], tot, dp[500010], lst[500010], gx[500010];
ll ans = 0;

struct node{
    int fa;
    char ch;
}p[500010];

struct edge{
    int to, next;
}e[500010];

void add(int u, int v)
{
    e[++tot].to = v;
    e[tot].next = head[u];
    head[u] = tot;
}

void update(int x)
{
    if(p[x].ch == '(')
        lst[x] = x, dp[x] = dp[p[x].fa], gx[x] = 0;
    else
    {
        if(lst[p[x].fa] > 0)
        {
            lst[x] = lst[p[lst[p[x].fa]].fa];
            gx[x] = gx[p[lst[p[x].fa]].fa] + 1;
            dp[x] = dp[p[x].fa] + gx[x];
        }
        else
        {
            lst[x] = 0;
            gx[x] = 0;
            dp[x] = dp[p[x].fa];
        }
    }
    return;
}

void dfs(int x)
{
    if(p[x].ch == '(')
        lst[x] = x, dp[x] = dp[p[x].fa], gx[x] = 0;
    else
    {
        if(lst[p[x].fa] > 0)
        {
            lst[x] = lst[p[lst[p[x].fa]].fa];
            gx[x] = gx[p[lst[p[x].fa]].fa] + 1;
            dp[x] = dp[p[x].fa] + gx[x];
        }
        else
        {
            lst[x] = 0;
            gx[x] = 0;
            dp[x] = dp[p[x].fa];
        }
    }
    for(R int i = head[x];i;i = e[i].next)
        dfs(e[i].to);
    return; 
}

int main()
{
    freopen("2019brackets.in","r",stdin);
	freopen("2019brackets.out","w",stdout);
    n = read();
    for(R int i = 1; i <= n; ++i)
        scanf("%c",&p[i].ch);
    for(R int i = 2; i <= n; ++i)
        p[i].fa = read(), add(p[i].fa, i);
    dfs(1);
    for(R ll i = 1; i <= n; ++i)
        ans = ans xor (i*dp[i]);
    cout << ans;
    return 0;
}