题面

不再多说,想必大家都看过这个题

思路

我们可以手推几个满足条件的字符串

我们发现在这些字符串里

每个)都与离它最近的(的匹配

所以我们维护树上每个节点到根节点中没用使用过的(的位置(nl[n]) h[i]表示以i的结尾的满足条件的串的个数

	nl[n] = nl[fa[n]];
if(value[n] == 1)
nl[n] = n;
else
{
if(nl[n] != 0)
{
ll f = fa[nl[n]];
nl[n] = nl[f];
h[n] = 1 + h[f];//把离)最近的(使用
}
}

最后因为是字串 所以需要h[i]前缀和

(注意\(1<=f_u<u\))

代码

#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
const ll M = 500015;
struct edge{
ll to,next;
}QWQ[M];
ll head[M],n,fa[M],value[M],h[M],nl[M],ans;
void merge(ll x,ll y)
{
QWQ[ ++QWQ[0].to ].to = x;
QWQ[ QWQ[0].to ].next = head[y];
head[y] = QWQ[0].to;
}
void dfs(ll n)
{
nl[n] = nl[fa[n]];
if(value[n] == 1)
nl[n] = n;
else
{
if(nl[n] != 0)
{
ll f = fa[nl[n]];
nl[n] = nl[f];
h[n] = 1 + h[f];
}
}
for(ll i = head[n];i;i = QWQ[i].next)
dfs(QWQ[i].to);
}
int main()
{
scanf("%lld",&n);
char c;
for(ll i = 1;i <= n;i++)
{
c = getchar();
while(c != '('&&c != ')')
c = getchar();
if(c == '(')
value[i] = 1;
if(c == ')')
value[i] = 2;
}
for(ll i = 2;i <= n;i++)
{
scanf("%lld",&fa[i]);
merge(i,fa[i]);
}
dfs(1);
ans = h[1];
for(ll i = 2;i <= n;i++)
{
ll j = i;
h[i] += h[fa[j]];
ans ^= i * h[i];
}
cout<<ans;
}

【CSP2019 D1T2】【括号树】的更多相关文章

  1. 上午小测3 T1 括号序列 && luogu P5658 [CSP/S 2019 D1T2] 括号树 题解

    前 言: 一直很想写这道括号树..毕竟是在去年折磨了我4个小时的题.... 上午小测3 T1 括号序列 前言: 原来这题是个dp啊...这几天出了好几道dp,我都没看出来,我竟然折磨菜. 考试的时候先 ...

  2. 【NOIP/CSP2019】D1T2 括号树

    原题: 因为是NOIP题,所以首先先看特殊数据,前35分是一条长度不超过2000的链,N^2枚举所有子区间暴力check就能拿到分 其次可以思考特殊情况,一条链的情况怎么做 OI系列赛事的特殊性质分很 ...

  3. 【CSP2019】括号树 题解(递推+链表)

    前言:抽时间做了做这道题,把学长送退役的题. ----------------- 题目链接 题目大意:定义$()$是合法括号串.如果$A,B$是合法括号串,那么$(AB),AB$为合法括号串.现给定根 ...

  4. CSP-S 2019 D1T2 括号树

    题目链接:[https://www.luogu.com.cn/problem/P5658] 思路: 这道题不难.(为什么我在考场上一点思路也没有??) 假设我们已经处理到树上的节点u(假设1为根节点) ...

  5. CSP2019 括号树

    Description: 给定括号树,每个节点都是 ( 或 ) ,定义节点的权值为根到该节点的简单路径所构成的括号序列中不同合法子串的个数(子串需要连续,子串所在的位置不同即为不同.)与节点编号的乘积 ...

  6. P5658 括号树

    P5658 括号树 题解 太菜了啥都不会写只能水5分数据 啥都不会写只能翻题解  题解大大我错了 我们手动找一下规律 我们设 w[ i ] 为从根节点到结点 i 对答案的贡献,也就是走到结点 i ,合 ...

  7. [CSP-S 2019]括号树

    [CSP-S 2019]括号树 源代码: #include<cstdio> #include<cctype> #include<vector> inline int ...

  8. 2021.08.09 P5658 括号树(树形结构)

    2021.08.09 P5658 括号树(树形结构) [P5658 CSP-S2019] 括号树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 太长,在链接中. 分析及代码 ...

  9. 2019CSP day1t2 括号树

    题目背景 本题中合法括号串的定义如下: () 是合法括号串. 如果 A 是合法括号串,则 (A) 是合法括号串. 如果 A,B 是合法括号串,则 AB 是合法括号串. 本题中子串与不同的子串的定义如下 ...

随机推荐

  1. TypeScript中将函数中的局部变量“导出”的方法

    首先是在模块a.js中声明一个可导出(export)的数据结构,例如: export class ModelInfo{ id: string; name:string; } 其次是在模块b中声明可导出 ...

  2. vue3双向数据绑定原理_demo

    <!DOCTYPE html> <head> <meta charset="UTF-8" /> <meta name="view ...

  3. freemarker自定义指令

    最近项目中使用了spring boot搭建项目,使用spring security管理项目中的权限,使用freemarker作为视图层.为了将权限控制到按钮上,因此考虑直接使用spring secur ...

  4. Qt学习-模仿Qt实现一个colorbutton

    1.mycolorbutton.h #include<QToolButton> #include<QtGlobal> #include<QColor> class ...

  5. QMake(Qt项目构建)

    qmake工具能够简化不同平台上的项目构建.可以自动产生Makefiles文件,仅仅需要少量的信息就可以生成Makefile文件.同时qmake也可以构建不是Qt的项目.qmake基于项目文件中的信息 ...

  6. stm32直流电机驱动与测速

    stm32直流电机驱动与测速 说实话就现在的市场应用中stm32已经占到了绝对住到的地位,51已经成为过去式,32的功能更加强大,虽然相应的难度有所增加,但是依然阻止不了大家学习32的脚步,不说大话了 ...

  7. (转)linux下错误的捕获:errno和strerror的使用,以及perror和strerror的区别

    经常在调用linux 系统api 的时候会出现一些错误,比方说使用open() write() creat()之类的函数有些时候会返回-1,也就是调用失败,这个时候往往需要知道失败的原因.这个时候使用 ...

  8. Bzoj通过5题纪念

    我A了五题啦!!!

  9. Luogu P1563 [NOIp2016提高组]玩具谜题 | 模拟

    题目链接 纯模拟题,没啥好说的,就是要判断地方有点多,一定要注意细节. #include<iostream> #include<cstdio> #include<fstr ...

  10. v3

    #include <iostream> #include <time.h> #include "map" #include "stdio.h&qu ...