后缀数组题目集锦

基础题 :

      论文其实写的很详细了,但是模板可能有点难看懂,需要花点时间去搞,建议一开始的时候写个nlogn^2的算法,推荐watashi翻译的那本书里面的讲解与代码实现,灰常清晰,其实也就是倍增排序的时候用快速排序来做,虽然时间上慢了点,但是对深刻理解SA RANK HEIGHT这三个数组有很大的好处,比赛的时候还是用论文里面的模板吧,速度快。

     对模板的熟悉,以及对sa数组,rank数组,height数组的理解,这三个数组是解决很多后缀问题的利器。

       part1 :论文题 

           最长重复子串: 稍微想一下就知道了,高度数组的最大值就是答案

            最长不重复子串 :    直接做比较难,先二分,然后变成判定性问题。

                  可重叠K次最长重复子串  :

                                    同上,二分变成判定性问题后分组,将最长公共前缀大于等于mid的分在同一组,只要判断是否有一组的数量大于等于k,不过这个题数比较弱,m值设成128也能AC,实测表示,数据中连大于128的数也没有。

                   求不同子串的个数1 求不同子串的个数2 

                                    将后缀排好序后,从上往下扫描,累加以s[sa[i]]开头的字符串,注意最长公共前缀的部分要去掉,因为在上一次已经算过了。

               求最长回文子串 

                                   很经典的题,虽然数据范围比较小,但是还是可以用来锻炼后缀数组。重新做的时候还是想了老半天。。。。

                                   解法:假设我们知道了回文子串的中心,假设是奇数个字符,那么求最长回文子串就是求以某个中心往两端最长能扩充的距离,而且一直都相等,如果将字符串倒过来,就是相当于求两个后缀的最长公共前缀了,具体实现时要用到RMQ求区间最值,还要考虑奇偶性,不过还是挺好写的。

                                                

             

      part 2  : 各大oj游走

           求字典序第k大的子串

                          这个题有两种做法,一种是用堆 , 另一种是用后缀数组,思想是一样的,提示:从每个位置开始不断地往后面扩展字符串。

                          后缀数组       

                    




神题


     keng!

 

posted on 2013-07-31 20:26  you Richer  阅读(425)  评论(0编辑  收藏  举报