RT 60 WA后四个点QAQ
#include <bits/stdc++.h>
#define ll long long
#define Mid ((L+R)>>1)
using namespace std;
typedef pair<int,int> pii;
inline int read(){
char c;int x=0;int b=1;do{c=getchar();if(c==45)b=-1;}while(c>57||c<48);
do x=x*10+c-48,c=getchar();while(c<=57&&c>=48);x*=b;return x;
}
const int maxn=20010;
int i,j,k,n,m,a[2*maxn],rank[maxn];
int nxt[maxn],id[maxn],S[maxn],S2[maxn],head[maxn],len,now[maxn],tmp[maxn],tmp2[maxn],len2,L;
int Rank[maxn];
void SA(){
for(i=1;i<=n;i++)now[i]=a[i],id[i]=i;
for(int Num=1;;Num*=2){
for(i=1;i<=n;i++)if(i+Num<=n)tmp[i]=a[i+Num];
for(i=1;i<=n;i++){
S[++len]=now[i];
S2[len]=id[i];
nxt[len]=head[tmp[i]];
head[tmp[i]]=len;
}
for(i=0;i<=n;i++){
int X=head[i];
while(X){
now[++len2]=S[X];
tmp[len2]=S2[X];
tmp2[len2]=i;
X=nxt[X];
}
}
for(i=1;i<=len;i++)nxt[i]=S[i]=S2[i]=0;len=0;
for(i=0;i<=n;i++)head[i]=0;
for(i=len2;i>=1;i--){
S[++len]=tmp[i];
S2[len]=tmp2[i];
nxt[len]=head[now[i]];
head[now[i]]=len;
}
len2=0;
L=0;
for(i=0;i<=n;i++){
int X=head[i],last=-1;
while(X){
if(S2[X]!=last)++L;
last=S2[X];
now[++len2]=L;
id[len2]=S[X];
X=nxt[X];
}
}
for(i=1;i<=len;i++)nxt[i]=S[i]=S2[i]=0;len=0;
for(i=0;i<=n;i++)head[i]=0;
len2=0;
if(L==n)break;
}
for(i=1;i<=n;i++)Rank[id[i]]=i;
}
int b[maxn],lth=1;
void got(int &x){
int L=1,R=lth;
while(1){
if(b[Mid]==x){x=Mid;return;}
if(b[Mid]>x)R=Mid-1;
else L=Mid+1;
}
}
int height[maxn];
void work(){
/*
for(i=1;i<=n;i++)b[i]=a[i];
sort(b+1,b+1+n);
for(i=2;i<=n;i++)
if(b[i]!=b[i-1])
b[++lth]=b[i];
for(i=1;i<=n;i++)got(a[i]);
*/
}
int Max[maxn][20],p[maxn];
int main() {
freopen("P2852.in","r",stdin);
freopen("P2852.out","w",stdout);
cin>>n>>m;
for(i=1;i<=n;i++)a[i]=read()+1;
work();
SA();
for(i=1;i<n;i++){
height[i]=max(height[i-1]-1,0);
for(j=height[i];j<=n;j++){
if(i+j<=n && a[i+j] == a[id[Rank[i]+1]+j])
++height[i];
else break;
}
}
for(i=1;i<=n;i++)Max[i][0]=height[i];
for(j=1;j<=19;j++)
for(i=1;i<=n;i++)
if(i+(1<<j-1)<=n)Max[i][j]=min(Max[i][j-1],Max[i+(1<<(j-1))-1][j-1]);
for(i=2;i<=n;i++)p[i]=p[i/2]+1;
int Ans=0;
for(i=1;i<=n-m+1;i++){
Ans=max(Ans,min(Max[i][p[m]],Max[(i+m-1)-(1<<p[m])+1][p[m]]));
}
cout<<Ans<<endl;
//cerr << 1.0*clock()/CLOCKS_PER_SEC << endl;
return 0;
}