题解 P2852 【[USACO06DEC]牛奶模式Milk Patterns】

· · 题解

这题是一道后缀数组的模板题。

出现k次,相当于我们选择了k个后缀,之后求出他们的最长公共前缀。

我们知道,后缀(j)和后缀(k)的 最 长 公 共 前 缀 为height[rank[j]+1],

height[rank[j]+2],height[rank[j]+3],…,height[rank[k]]中的最小值(设rank[j]<rank[k])。

那么设k个后缀中rank的min=l,max=r,k个的最长公共前缀就是min(height[l+1->r])

所以k个后缀在rank上一定是连续的。

枚举i,维护height[i->i+k-1]的min,用单调队列即可O(N)解决。(还要加上求出rank,height的时间)