后缀数组的一些技巧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了后缀数组的一些技巧相关的知识,希望对你有一定的参考价值。

后缀数组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)求出。

以上是关于后缀数组的一些技巧的主要内容,如果未能解决你的问题,请参考以下文章

后缀数组小结

后缀数组

后缀数组总结

后缀数组入门

poj2774 后缀数组

poj2774 后缀数组