后缀数组刷题小结

大鸽子终于来更博客了

hihocoder后缀数组1

二分法:

显然答案满足单调性,所以我们选择二分答案

我们把(height)数组中小于(mid)的数全部去掉,这样会把(height)数组分成若干个连续段,然后检查一下有没有一个连续段超过了(k)个数字

并查集法:

先将所有(height)的下标按照(geight)数组值大小排序,每次将最大的两个集合合并,当集合内数量超过(k)个时,当前合并的值就是答案

大鸽子是不会贴代码的

hihocoder后缀数组2

二分答案,然后康康是否在某一组里面有两个起点之间的距离相差大于(mid)

hihocoder后缀数组3

两个串拼起来跑后缀数组,二分答案,然后康康是否某一组里面有起点分别位于两个串

hihocoder后缀数组4

(b)题目在说个机八,据说是求重复次数最多的连续子串

我们有一个暴力:枚举循环节的长度,然后求(lcp(i,i+len))就可以知道循环次数啦!,复杂度(O(n^2))

考虑某个玄学的优化:对于枚举的循环节长度(len),只枚举(len)的倍数的位置

(tmp=lcp(i,i+len))

更新答案的时候额外更新一个:(frac{lcp(i-len+tmp\%len,i+tmp\%len)}{len}+1)

为什么呢,因为如果在(i-len+tmp%len)右边的起始位置,因为(tmp)除去循环节多余出来的那部分根本没有那么长,不可能多凑出一个循环节

而如果(i-len+tmp%len)这个位置不能多出一个循环节的话,说明左边也匹配不上,没必要再匹配了

原文地址:https://www.cnblogs.com/knife-rose/p/12346345.html