Pagini recente » Cod sursa (job #456534) | Cod sursa (job #2447006) | Formatare Textile | Cod sursa (job #898493) | Cod sursa (job #2340067)
#include <bits/stdc++.h>
using namespace std;
#define maxn 17000
#define f first
#define s second
int n,k,e;
int rmq[18][maxn],sol[maxn],ans;
pair<pair<int,int>,int> L[maxn];
int lcp(int st,int dr){
int pow=(1<<e),ans=0,f=e;
while(pow!=0){
if(rmq[e][st]==rmq[f][dr])
st+=pow,dr+=pow,ans+=pow;
pow>>=1;
--f;
}
return ans;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
char x;
int i,len;
cin>>n>>k;
if(k==1) {cout<<n;return 0;}
for(i=0;i<n;++i){
cin>>x;
rmq[0][i]=x-'a';
}
for(e=0,len=1;len<=n;++e,len*=2){
for(i=0;i<n;++i){
L[i].f.f=rmq[e][i];
L[i].f.s=((i+len<n)?rmq[e][i+len]:-1);
L[i].s=i;
}
sort(L,L+n);
rmq[e+1][L[0].s]=0;
for(i=1;i<n;++i)
if(L[i-1].f.f==L[i].f.f&&L[i-1].f.s==L[i].f.s)
rmq[e+1][L[i].s]= rmq[e+1][L[i-1].s];
else
rmq[e+1][L[i].s]= rmq[e+1][L[i-1].s] +1;
}
for(i=0;i<n;++i)
sol[rmq[e][i]]=i;
for(i=0;i+k-1<n;++i)
ans=max(ans,lcp(sol[i],sol[i+k-1]));
cout<<ans;
}