CF1095E Almost Regular Bracket Sequence [高级前后缀和]

CF1095E Almost Regular Bracket Sequence

给定一个长度为 \(n\) 的小括号序列,求有多少个位置满足将这个位置的括号方向反过来后使得新序列是一个合法的括号序列。

这道题要用到高级前缀和+后缀和。

我们设两个int数组\(s1\)\(s2\),两个bool数组\(b1\)\(b2\)

\(s1\)数组这么处理:顺序遍历字符串,遇到左括号\(+1\),遇到右括号\(-1\)

\(s2\)数组这么处理:逆序遍历字符串,遇到右括号\(+1\),遇到左括号\(-1\)

\(b1\)数组这么处理:\(s1\)数组相应值\(\geq 0\)的下标为true。

\(b2\)数组这么处理:\(s2\)数组相应值\(\geq 0\)的下标为true。

显然,\(b1\)\(b2\)数组为true的地方,前面才不会产生别的不匹配,才能考虑与答案计算。

最后,遍历字符串,设找到第\(i\)个时,当前后都合法时,分两种情况考虑:

  1. 当前字符是左括号。改为右括号后,发现需要满足前面的\(s1\)\(1\)再减后面的\(s2\)为0,这个点就满足。
  2. 当前字符是右括号。改为左括号后,发现需要满足前面的\(s1\)加1再减后面的\(s2\)为0,这个点就满足。

最后输出就完事了。

转载于:https://www.cnblogs.com/Garen-Wang/p/10349332.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值