ZOJ3533-Gao the String I

好吧,这场比赛被完虐,3+3 来的太不容易了,这题在之前见过类似的问题,不过那题至今没过,还是处于 TLE 的状态 - -

题号是 UVA11996,感兴趣的孩子可以去写写

这题的主要思路是利用 splay 维护序列,对于 reverse 和 modify 操作都可以直接利用 splay 来维护,主要的问题是 lcp 的求法,lcp 比较直接的做法是二分长度,然后利用 splay 维护 hash 值。利用数据结构来维护 hash 值,这个在多校里面见过好多次了,最近的一场是 FZU 的 B 题?维护的是前缀 hash 值,和后缀 hash 值 (为了翻转操作),判断区间的 hash 值是否相同即可,保险一点可以用双 hash。

Manacher 对于最长回文的求法,可以使用 O(N)O(N) 的 Manacher 算法 [1]

相对于那些大代码量的题,这题算是较短代码了,主要处理好 splay 的部分,对于求回文,直接把 splay 进行 dfs 下放,然后得到字符串,然后执行 O(N)O(N) 的回文即可。

这题需要注意的地方如下:

dfs 的时候要下放,否则会有问题

llrr 需要交换,如果 l>rl>r 的话

代码量在 280 左右,splay 的标准线


  1. http://zhuhongcheng.wordpress.com/2009/08/02/a-simple-linear-time-algorithm-for-finding-longest-palindrome-sub-string/ ↩︎