后缀数组题目集锦
基础题 :
论文其实写的很详细了,但是模板可能有点难看懂,需要花点时间去搞,建议一开始的时候写个nlogn^2的算法,推荐watashi翻译的那本书里面的讲解与代码实现,灰常清晰,其实也就是倍增排序的时候用快速排序来做,虽然时间上慢了点,但是对深刻理解SA RANK HEIGHT这三个数组有很大的好处,比赛的时候还是用论文里面的模板吧,速度快。
对模板的熟悉,以及对sa数组,rank数组,height数组的理解,这三个数组是解决很多后缀问题的利器。
part1 :论文题
最长重复子串: 稍微想一下就知道了,高度数组的最大值就是答案
最长不重复子串 : 直接做比较难,先二分,然后变成判定性问题。
同上,二分变成判定性问题后分组,将最长公共前缀大于等于mid的分在同一组,只要判断是否有一组的数量大于等于k,不过这个题数比较弱,m值设成128也能AC,实测表示,数据中连大于128的数也没有。
将后缀排好序后,从上往下扫描,累加以s[sa[i]]开头的字符串,注意最长公共前缀的部分要去掉,因为在上一次已经算过了。
很经典的题,虽然数据范围比较小,但是还是可以用来锻炼后缀数组。重新做的时候还是想了老半天。。。。
解法:假设我们知道了回文子串的中心,假设是奇数个字符,那么求最长回文子串就是求以某个中心往两端最长能扩充的距离,而且一直都相等,如果将字符串倒过来,就是相当于求两个后缀的最长公共前缀了,具体实现时要用到RMQ求区间最值,还要考虑奇偶性,不过还是挺好写的。
part 2 : 各大oj游走
这个题有两种做法,一种是用堆 , 另一种是用后缀数组,思想是一样的,提示:从每个位置开始不断地往后面扩展字符串。
神题
keng!