1 条题解
-
0
猫咪升级(简单版)题解
思路
把每一对匹配括号看成一棵有根有序树中的一个结点。一个结点直接包含的若干对括号就是它的孩子;字符串最外层的若干括号块则是虚根的孩子。
任意 RBS 子串恰好对应同一个父亲的一段连续孩子。若某个结点有 个孩子,设每个孩子内部的 RBS 子串数已经求出,则该结点覆盖的字符串内部包含:
- 结点自身对应的一个 RBS;
- 各孩子内部的全部答案;
- 由至少两个连续孩子拼接得到的 个 RBS。
因此
$$f(u)=1+\sum_{v\text{ 是 }u\text{ 的孩子}}f(v)+\frac{c(c-1)}2.$$小规模可以枚举查询区间中的所有子串并检查括号平衡。中规模可以对每次查询重新用栈建立局部森林,在线计算上述递推,复杂度为区间长度。满分做法只需对整串建树一次。
做法
用栈扫描字符串,为每个左括号建立结点,并在遇到匹配右括号时记录结点编号。按结点编号逆序计算 。
对同一父结点的孩子,按从左到右顺序记录:
rank(u): 是第几个孩子;prefix(u): 之前所有兄弟的 之和。
查询区间 是 RBS,所以 对应的左括号结点 与 对应的右括号结点 一定是同一父结点下的一段连续兄弟。设这段共有
个结点,则答案为
第一项求出所有选中兄弟各自内部的答案,第二项补上由多个兄弟拼接形成的 RBS。
复杂度
预处理时间和空间复杂度均为 ,每个查询 ,总时间复杂度为 。
- 1
信息
- ID
- 1308
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者