Cod sursa(job #345665)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 4 septembrie 2009 01:31:12
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;


#define file_in "substr.in"
#define file_out "substr.out"

#define Nmax 17000
#define Lg 17

char A[Nmax];
struct entry 
{
    int nr[2], p;
} 
L[Nmax];
int P[Lg][Nmax],n,i,stp,cnt,rez,aux,s;


bool cmp(const entry &a, const entry &b) 
{
    return a.nr[0]==b.nr[0]?(a.nr[1]<b.nr[1]):(a.nr[0]<b.nr[0]);
}

int lcp(int x, int y) 
{
    int k,ret=0;
    if (x==y) 
		return n-x;
    for (k=stp-1;k>=0 && x<n && y<n;--k)
        if (P[k][x]==P[k][y])
            x+=1<<k,
			y+=1<<k, 
			ret+=1<<k;
    return ret;
}


int main()
{
	int i,j,k;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d\n", &n,&k);
	gets(A);
	
	for (i=0;i<n;++i)
        P[0][i]=A[i]-'0';
    for (stp=1,cnt=1;(cnt>>1)<n;++stp,cnt<<=1)
	{
        for (i=0;i<n;++i) 
		{
            L[i].nr[0]=P[stp-1][i];
            L[i].nr[1]=i+cnt<n?P[stp-1][i+cnt]:-1;
            L[i].p=i;
        }
        sort(L,L+n,cmp);
        for (i=0;i<n;++i)
            P[stp][L[i].p]=i>0 && L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1]==L[i-1].nr[1]?P[stp][L[i-1].p]:i;
   	}
   
	int rez=0;
	for(i=0;i+k-1<n;++i)
	{
		aux=lcp(L[i].p,L[i+k-1].p);
		if(aux>rez)
			rez=aux;
	}
	
	printf("%d\n",rez);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}