码迷,mamicode.com
首页 > 编程语言 > 详细

后缀数组的一些技巧

时间:2017-05-29 22:21:37      阅读:216      评论:0      收藏:0      [点我收藏+]

标签:str   二分   ber   开始   大于   距离   min   max   字符   

后缀数组sa[i]i<j,sa[i]开头的字符串字典序<sa[j]开头字典序。

求后缀数组的方法:倍增{

  按一段排序,倍增至第二段为第二关键字,把他的值搞到桶中,比较。

  若两个合并的串前后两段一毛一样,排名设为一样。就这样搞。

}

rnk[i]i为开头的后缀的排名

height数组:KMP的思想{

  height数组为排名为ii-1的后缀的最长公共子串。

  利用KMP的思想:有h[rnk[i]]>=h[rnk[i-1]]-1;

  那每次就从sa[rnk[i]-1]开始比对。

  }一般的,我们在字符串最后补个0,使排名从1开始。

后缀数组技巧:

1.对于可重复的最长重复子串问题,可以直接遍历height[1..n],易知排名相邻的字符串最相似。

2.对于不可重复的最长重复子串问题,可以二分答案,遍历height[1..n]分组:

每组大于mid,若碰到一个小于mid的更新。

判断这一组中的max(sa[i])-min(sa[i])是否大于等mid

这意味着两个距离大于mid,且存在公共子串长于mid。重新开始一轮。

有希望成为最长公共前缀不小于 k 的两个后缀一定在同一组.所以可以O(nlogn)求出。

后缀数组的一些技巧

标签:str   二分   ber   开始   大于   距离   min   max   字符   

原文地址:http://www.cnblogs.com/zzmmm/p/6919137.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!