[20191006机房测试] 括号序列

可怜不喜欢括号序列,但是她发现总是有人喜欢出括号序列的题
为了让全世界都能感受到她的痛苦,她想要写-个转换器
它能把普通的小写字符串转换成长度相同的合法的括号序列
在可怜的构思中,这样的转换器需要满足如下两个条件:
1. 结果的括号序列必须要是合法的,即左右括号必须要是相匹配的。
2. 对于一堆相匹配的左右括号,他们所在的位置原来的小写字母必须相同。
举例来说,对于字符串aabaab,()(()) 就是一个合法的答案,而()()()不满足第二个条件,((())不满足第一个条件
可怜发现对于一个小写字符串,有时候有很多满足条件的括号序列,有些时候一个都没有
于是可怜给出了一个小写字符串,她想让你帮她算一下,有多少不同的子串可以转化为满足条件的括号序列

这题的思路有点神仙啊……
暴力方法是对于每个字母维护一个栈
每次向后枚举,遇到不同的字母就入栈,如果字母和前一个相同,双双弹出(双双:?)
但这样的时间复杂度是 \(\Theta{(n^2)}\) 的,所以我们想想优化

其实我们只需要开一个栈,每到一个位置操作完以后,把当前栈的情况用hash记录一下
如果有多个位置的hash值相同,就说明这几个位置之间的字母被弹出了
说明以这几个位置为端点,其中间的区间一定是合法,且连续的
然后我们把所有hash值排一下序,看每个连续的一段
如果一段的长度为len,它对答案的贡献就是\(\dfrac{len*(len-1)}{2}\)

然后就结束了

猜你喜欢

转载自www.cnblogs.com/tqr06/p/11627329.html