塔
-
问题描述
有一个塔,他的名字叫做粽粑,粽粑的每一层都有一个颜色 .
粽粑非常厉害,它在吸收天地精华之后会长高.粽粑的长高方式有两种:
1.在塔顶长出一层.
2.在塔底长出一层,即原来的第一层变成第二层,第二层变成第三层,以此类推,新长出来的是第一层.
粽粑有可能在某个时刻不是很开心,这个时候它会撤销它的前若干次长高.
你现在想知道粽粑长高的奥秘,于是找到了粽粑,发现它的入口上写着这么一句话:要进入粽粑,请找出一段最长的塔的区间,满足翻转后颜色不变.
粽粑会不断的长高(或撤销),所以它每次长高(或撤销)后你都要回答.为了你的方便,粽粑一开始的高度为0。
q<=10^7
样例输入
7
101102100299199198298
样例输出
25
题意让维护一个串的最长回文子串长度,并且要支持修改和撤销,并且强制在线。
如果数据范围稍微小点,那么就是回文树裸题。但这题显然是故意要卡它。
注意到每次操作后,最长回文子串长度最多增加2,且一定包含操作的端点,那么可以用哈希来解决。
哈希的主要思想是记录从左到右的前缀哈希值,再记录从右到左的后缀哈希值,然后判断一个区间$[L,R]$是否回文的时候,只需要取出$[L,R]$的前缀哈希值和后缀哈希值比较一下即可。
至于撤销操作,只需要维护一个时间戳就行了,直接暴力撤销,复杂度是线性的。
代码实现的时候可以将在零点左边和右边的部分分开维护,分别记录一下$pow$递增和递减的哈希值,递减的用逆元处理。然后查询的时候再把左右两段拼接起来。具体可以参考代码。
复杂度$O(q)$
代码:
1 |
|