zoukankan      html  css  js  c++  java
  • 后缀数组题目集锦

    基础题 :

          论文其实写的很详细了,但是模板可能有点难看懂,需要花点时间去搞,建议一开始的时候写个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!

  • 相关阅读:
    看别人的代码学习的css
    Font Awesome
    响应式网站设计
    css兼容性的问题
    英语
    我的bootstrap使用的历程
    jquery的常用的容易忘记的东西
    jquery基本方法
    js与jquery的区别
    134123
  • 原文地址:https://www.cnblogs.com/riskyer/p/3228678.html
Copyright © 2011-2022 走看看