Description:


农夫John发现他的奶牛产奶的质量一直在变动。经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠。我们称之为一个“模式”。 John的牛奶按质量可以被赋予一个0到1000000之间的数。并且John记录了N(1<=N<=20000)天的牛奶质量值。他想知道最长的出现了至少K(2<=K<=N)次的模式的长度。比如1 2 3 2 3 2 3 1 中 2 3 2 3出现了两次。当K=2时,这个长度为4。

Input:


* Line 1: 两个整数 N,K。

* Lines 2..N+1: 每行一个整数表示当天的质量值。

Output:


* Line 1: 一个整数:N天中最长的出现了至少K次的模式的长度

Sample Input:


Sample Output:


题解:


好吧刚开始写后缀数组的我这道题目还是改了一会儿的QAQ

我们处理处height数组以后可以观察到这样一个性质,一个字符串若出现多次,则出现位置的这一些后缀必定rank是连着的。

也就是如果有height数组中连续的k-1个后缀最小值大于x,那么必定有一个长度为x的字符串至少出现了k次。

因此我们只要动态维护长度为k-1的区间的最小值。可以用一个单调队列实现。(这样可以 \(O(n)\) ,然而我并不会DC3构造后缀数组)

此题也可以使用二分,但是我没有写 [摊手],于是我把Wearry的代码贴了上来~

以下是我的代码(单调队列):

二分的代码(二分部分来源于Wearry)