大鸽子终于来更博客了
二分法:
显然答案满足单调性,所以我们选择二分答案
我们把(height)数组中小于(mid)的数全部去掉,这样会把(height)数组分成若干个连续段,然后检查一下有没有一个连续段超过了(k)个数字
并查集法:
先将所有(height)的下标按照(geight)数组值大小排序,每次将最大的两个集合合并,当集合内数量超过(k)个时,当前合并的值就是答案
大鸽子是不会贴代码的
二分答案,然后康康是否在某一组里面有两个起点之间的距离相差大于(mid)
两个串拼起来跑后缀数组,二分答案,然后康康是否某一组里面有起点分别位于两个串
这(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)这个位置不能多出一个循环节的话,说明左边也匹配不上,没必要再匹配了