社区讨论

10pts求助

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lo293j4q
此快照首次捕获于
2023/10/23 10:00
2 年前
此快照最后确认于
2023/11/03 10:12
2 年前
查看原帖
CPP
#include <bits/stdc++.h>

const int MAXN = 500000;

int n, fa[MAXN + 5];

long long f[MAXN + 5], ans;

std::string st;

std::stack<int> stack;

std::vector<int> sons[MAXN + 5];

void dfs(int u) {
    int oldSize = stack.size(), oldTop = 0;
    if (oldSize) {
        oldTop = stack.top();
    }
    if (st[u] == '(') {
        f[u] = f[fa[u]];
        stack.push(u);
    } else {
        if (stack.empty()) {
            f[u] = f[fa[u]];
        } else {
            f[u] = f[fa[u]] + 1;
            stack.pop();
        }
    }
    for (int v: sons[u]) {
        dfs(v);
    }
    while (oldSize < stack.size()) {
        stack.pop();
    }
    if (oldSize > stack.size()) {
        stack.push(oldTop);
    }
}

int main() {
    scanf("%d", &n);
    st.resize(n + 1);
    scanf("%s", &st[1]);
    for (int i = 2; i <= n; i++) {
        scanf("%d", &fa[i]);
        sons[fa[i]].push_back(i);
    }
    dfs(1);
    for (int i = 1; i <= n; i++) {
        ans ^= f[i] * i;
    }
    printf("%lld", ans);
    return 0;
}

回复

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

正在加载回复...