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

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

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

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

    然后就结束了

  • 相关阅读:
    Cheatsheet: 2013 08.14 ~ 08.19
    Cheatsheet: 2013 08.01 ~ 08.13
    Cheatsheet: 2013 07.21 ~ 07.31
    Cheatsheet: 2013 07.09 ~ 07.20
    Cheatsheet: 2013 07.01 ~ 07.08
    Cheatsheet: 2013 06.23 ~ 06.30, Farewell GoogleReader(2008.07.20~2013.06.30)
    Cheatsheet: 2013 06.01 ~ 06.22
    mysql数据库备份参数
    css3 显示一行内容,多余的以省略号显示
    NPM install -save 和 -save-dev
  • 原文地址:https://www.cnblogs.com/tqr06/p/11627329.html
Copyright © 2011-2022 走看看