小Y 最近开始学习算法姿势,但是因为小R 非常BB,给了她很多B6 题,所以她觉得自己已经没有什么前途了。
于是小R 给了她一些稍微简单的题,让她觉得已经没有什么好害怕的了,其中一道是这样的:
给定一个长度为n 只包含左括号和右括号的序列,现在小R 想要知道经过每一个位置的合法子串有多少个。
空串是一个合法的串,如果A 和B 都是合法的串,那么(A) 和AB 都是合法的串。 n<=1000000
又是差分的题目,非常坑
先给括号配对,让后记一对合法的括号为[l,r)
我们分别按顺序和倒序处理每对括号[l,r)
对于括号[l,r)我们先对区间[l,r)加上1,让后考虑它的影响
若l是另一对括号[l',r')的右端点(r'=l)那么显然这里的[l,r)贡献可以全部加过去
若r是另一对括号[l',r')的左端点,那么显然也可以把[l,r)的贡献全加过去
不合法的括号位置会自动抵消