Pagini recente » Cod sursa (job #1322000) | Cod sursa (job #1819178) | Cod sursa (job #1932763) | Cod sursa (job #624515) | Cod sursa (job #1066140)
#include<cstdio>
#include<algorithm>
using namespace std;
const int NMAX = 16500;
const int LMAX = 16;
int N,K,i,step,cnt,P[LMAX][NMAX],V[NMAX],SOL;
char S[NMAX];
struct Piece {int x,y,i;} L[NMAX];
bool cmp(Piece A,Piece B)
{
if(A.x==B.x) return A.y<B.y;
return A.x<B.x;
}
void SuffixArrays()
{
for(i=1;i<=N;i++) P[0][i]=S[i]-'a';
for(step=1,cnt=1;cnt<=N;step++,cnt*=2)
{
for(i=1;i<=N;i++)
{
L[i].x=P[step-1][i];
if(i+cnt<=N) L[i].y=P[step-1][i+cnt]; else L[i].y=-1;
L[i].i=i;
}
sort(L+1,L+N+1,cmp);
for(i=1;i<=N;i++)
{
if(i>1 && L[i].x==L[i-1].x && L[i].y==L[i-1].y) P[step][L[i].i]=P[step][L[i-1].i];
else P[step][L[i].i]=i;
}
}
for(i=1;i<=N;i++) V[P[step-1][i]]=i;
}
int LCP(int X,int Y)
{
if(X==Y) return N-X+1;
int R=0;
for(int i=step-1;i>=0 && X<=N && Y<=N;i--)
if(P[i][X]==P[i][Y])
{
R+=(1<<i);
X+=(1<<i);
Y+=(1<<i);
}
return R;
}
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&N,&K); scanf("%s",S+1);
SuffixArrays();
for(i=1;i<=N-K+1;i++) SOL=max(SOL,LCP(V[i],V[i+K-1]));
printf("%d\n",SOL);
return 0;
}