Cod sursa(job #1066140)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 24 decembrie 2013 01:18:55
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#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;
}