Pagini recente » Cod sursa (job #1877166) | Cod sursa (job #1652318) | Cod sursa (job #1335808) | Cod sursa (job #1694902) | Cod sursa (job #1067401)
#include<algorithm>
#include<vector>
#include<utility>
#include<cstdio>
using namespace std;
const int NMAX = 2*16385;
char S[NMAX];
int N,K,logN,sol;
int P[16][NMAX];
int V[NMAX];
pair<pair<int,int>,int> L[NMAX];
void suffix_arrays()
{
int i,j,k;
for(i=1; i<=N; i++) P[0][i]=S[i]-'a'+1;
for(i=j=1; j<=N; i++, j<<=1)
{
for(k=1; k<=N; k++)
L[k]=make_pair(make_pair(P[i-1][k],P[i-1][k+j]),k);
sort(L+1,L+N+1);
for(k=1; k<=N; k++)
{
if(k>1 && L[k].first.first == L[k-1].first.first && L[k].first.second == L[k-1].first.second) P[i][L[k].second]=P[i][L[k-1].second];
else P[i][L[k].second]=k;
}
}
logN=i-1;
for(i=1; i<=N; i++) V[P[logN][i]]=i;
}
int LCP(int X,int Y)
{
int i,rtn=0;
if(X==Y) return N-X+1;
for(i=logN; i>=0 && X<=N && Y<=N; i--)
if(P[i][X]==P[i][Y])
{
X+=(1<<i);
Y+=(1<<i);
rtn+=(1<<i);
}
return rtn;
}
int main()
{
int i;
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&N,&K);
scanf("%s",S+1);
suffix_arrays();
for(i=1; i<=N-K+1; i++)
sol=max(sol,LCP(V[i],V[i+K-1]));
printf("%d\n",sol);
return 0;
}