后缀数组刷题小结

大鸽子终于来更博客了

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\)这个位置不能多出一个循环节的话,说明左边也匹配不上,没必要再匹配了

猜你喜欢

转载自www.cnblogs.com/knife-rose/p/12346345.html