55 pts 用栈求助
  • 板块题目总版
  • 楼主SilverLi
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/6/20 22:43
  • 上次更新2023/11/3 13:28:19
查看原帖
55 pts 用栈求助
688783
SilverLi楼主2023/6/20 22:43

[CSP-S2019] 括号树\text{[CSP-S2019] 括号树}

#include <iostream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
const int N = 5e5 + 5;
int n, f[N];
int sum[N];
string s;
vector<int> g[N];
void dfs(int u, int ft, stack<int> sta) {
    if (s[u] == ')')
        if (!sta.empty()) {
            f[u] = f[sta.top() - 1] + 1;
            sta.pop();
        }
    if (s[u] == '(')    sta.push(u);
    sum[u] = sum[ft] + f[u];
    for (int l = 0; l < g[u].size(); ++l) {
        int i = g[u][l];
        dfs(i, u, sta);
    }
}
signed main() {
    cin >> n >> s;
    s = ' ' + s;
    for (int i = 2; i <= n; ++i) {
        int fa;
        cin >> fa;
        g[fa].push_back(i);
    }
    stack<int> sta;
    dfs(1, 0, sta);
    int ans = 0;
    for (int i = 1; i <= n; ++i)
        ans ^= i * sum[i];
    cout << ans;
    return 0;
}
2023/6/20 22:43
加载中...