Rt,SAM写挂了。板子题有人帮忙看下吧。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define N 50005
using namespace std;
struct SAM{
int fa[N],len[N],idx,pre,sz[N];
map<int,int>nxt[N];
SAM(){fa[0]=~0;idx=pre=len[0]=0;}
void extend(int ch){
int cur=++idx,p=pre;len[cur]=len[pre]+1;
while(~p&&!nxt[p][ch])nxt[p][ch]=cur,p=fa[p];
if(p==-1)fa[cur]=0;
else{
int q=nxt[p][ch];
if(len[p]+1==len[q])fa[cur]=q;
else{
int now=++idx;len[now]=len[p]+1;
nxt[now]=nxt[q],fa[now]=fa[q],fa[q]=fa[cur]=now;
while(~p&&nxt[p][ch]==q)nxt[p][ch]=now;
}
}sz[pre=cur]=1;
}
int c[N],b[N];
void init(){
rep(i,1,idx)c[len[i]]++;
rep(i,1,idx)c[i]+=c[i-1];
rep(i,1,idx)b[c[len[i]]--]=i;
pre(i,idx,1)sz[fa[b[i]]]+=sz[b[i]];
}
int solve(int k){
int ans=0;
rep(i,1,idx)if(sz[i]>=k)ans=max(ans,len[i]);
return ans;
}
}w;
int main(){
//freopen("input","r",stdin);
int n,k;
scanf("%d%d",&n,&k);
rep(i,1,n){
int x;scanf("%d",&x);
//if(x!=1)printf("ss %d %d\n",i,x);
w.extend(x);
}
w.init();
printf("%d\n",w.solve(k));
return 0;
}
/*
g++ 2851.cpp -o a -Wall -std=c++11
*/