洛谷 P5658 [CSP-S2019] 括号树
洛谷 P5658 [CSP-S2019] 括号树
题意
给定一棵树,每个点有一个括号 (
或 )
。
定义
求每个
思路
定义
有
若
若
若没有左括号和它匹配,
若有左括号和它匹配,设为第
即这一段匹配的括号接在上一段后面,又多出来了一个。
如图,黑色表示上一段的
由于两个合法子串拼接后仍为合法子串,所以
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 5e5 + 5;
int n, fa[N], stk[N], top;
char s[N];
ll ans, g[N], f[N];
vector <int> E[N];
void dfs(int x) {
int flg = 0;
if (s[x] == '(') stk[++ top] = x;
else if (top) g[x] = g[fa[stk[top]]] + 1, flg = stk[top --];
f[x] = f[fa[x]] + g[x];
for (auto y : E[x]) dfs(y);
if (s[x] == '(') top --;
else if (flg) stk[++ top] = flg;
}
int main() {
scanf("%d", &n);
scanf("%s", s + 1);
for (int i = 2; i <= n; i ++)
scanf("%d", &fa[i]),
E[fa[i]].push_back(i);
dfs(1);
for (int i = 1; i <= n; i ++)
ans ^= 1ll * i * f[i];
printf("%lld\n", ans);
return 0;
}
本文来自博客园,作者:maniubi,转载请注明原文链接:https://www.cnblogs.com/maniubi/p/18400884,orz
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2022-09-06 CF1717A题解