社区讨论

85pts求调

P5658[CSP-S 2019] 括号树参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mhjaor5z
此快照首次捕获于
2025/11/03 23:28
4 个月前
此快照最后确认于
2025/11/03 23:28
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 501000;

int n;
char s[N];
int st[N], top;
ll sum[N], nst[N], ans;

struct Node {
    int head, nxt, fa;
} a[N];

inline void dfs(int x) {
    int tmp = 0;
    if (s[x] == ')') {
        if (top) {
            tmp = st[top--];
            nst[x] = nst[a[tmp].fa] + 1;
        }
    } else {
        st[++top] = x;
    }
    sum[x] = sum[a[x].fa] + nst[x];
    for (int i = a[x].head; i; i = a[i].nxt) dfs(i);
    if (!tmp) s[++top] = tmp;
    else if (top) top--;
}

int main() {
    scanf("%d", &n);
    scanf("%s", s + 1);
    for (int i = 2; i <= n; i++) {
        int f;
        scanf("%d", &f);
        a[i].nxt = a[f].head;
        a[f].head = i;
        a[i].fa = f;
    }
    dfs(1);
    for (int i = 1; i <= n; i++)
        ans ^= (ll)i * sum[i];
    printf("%lld\n", ans);
}

回复

0 条回复,欢迎继续交流。

正在加载回复...