zoukankan      html  css  js  c++  java
  • [20191006机房测试] 括号序列

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

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

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

    然后就结束了

  • 相关阅读:
    shell脚本杀掉指定进程下所有子进程(包括子进程的子进程)
    XDebug调试
    PHP基础入门
    猴子补丁(Monkey Patching)
    编写python高质量python代码的59个有效方法
    ubuntu中不能使用终端的情况
    一些个人有用的网站
    Ubuntu将自带的python3升级
    [Vue warn]: You may have an infinite update loop in a component render function.
    OO第四单元总结&期末总结
  • 原文地址:https://www.cnblogs.com/tqr06/p/11627329.html
Copyright © 2011-2022 走看看