标签:str 二分 ber 开始 大于 距离 min max 字符
后缀数组sa[i]:i<j,有sa[i]开头的字符串字典序<sa[j]开头字典序。
求后缀数组的方法:倍增{
按一段排序,倍增至第二段为第二关键字,把他的值搞到桶中,比较。
若两个合并的串前后两段一毛一样,排名设为一样。就这样搞。
}
rnk[i]:i为开头的后缀的排名
height数组:KMP的思想{
height数组为排名为i与i-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