Cod sursa(job #543683)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 28 februarie 2011 14:48:01
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>
#include <algorithm>
#define pii pair <int,int>
#define LMAX 16505
#define HMAX 18
#define INF 2000000000
#define pb push_back
#define f first
#define s second
using namespace std;
int n,k,r,B[HMAX][LMAX],ord[LMAX],cat,a,b,rez;
char A[LMAX];
pii C[LMAX];
bool comp1(int x,int y)
{
	return A[x]<A[y];
}
bool comp2(int x,int y)
{
	if (C[x].f<C[y].f)
		return 1;
	if (C[x].f>C[y].f)
		return 0;
	if (C[x].s<C[y].s)
		return 1;
	return 0;
}
void suffix_arrays()
{
	int i,j,poz;
	for (i=1; i<=n; i++)
		ord[i]=i;
	r=0;
	sort(ord+1,ord+n+1,comp1);
	B[0][ord[1]]=++r;
	for (i=2; i<=n; i++)
		if (A[ord[i]]==A[ord[i-1]])
			B[0][ord[i]]=r;
		else
			B[0][ord[i]]=++r;
	for (i=1; ; i++)
	{
		for (j=1; j<=n; j++)
		{
			C[j].f=B[i-1][j]; 
			poz=j+1<<(i-1);
			C[j].s=poz>n ? INF : B[i-1][poz];
			ord[j]=j;
		}
		sort(ord+1,ord+n+1,comp2);
		r=0;
		B[i][ord[1]]=++r;
		for (j=2; j<=n; j++)
		{
			if (C[ord[j]].f==C[ord[j-1]].f && C[ord[j]].s==C[ord[j-1]].s)
				B[i][ord[j]]=r;
			else
				B[i][ord[j]]=++r;
		}
		if ((1<<i)>n)
		{
			cat=i;
			break ;
		}
	}
}
int lcp(int cat)
{
	if (cat==-1)
		return 0;
	if (a>b || b>n)
		return 0;
	if (B[cat][a]==B[cat][b])
	{
		a+=1<<cat; b+=1<<cat;
		return (1<<cat)+lcp(cat-1);
	}
	return lcp(cat-1);
}
int main()
{
	freopen("substr.in","r",stdin);
	freopen("substr.out","w",stdout);
	scanf("%d%d\n",&n,&k);
	fgets(A+1,LMAX,stdin);
	suffix_arrays();
	int i,l;
	for (i=1; i<=n-k+1; i++)
	{
		a=ord[i]; b=ord[i+k-1];
		l=lcp(cat);
		if (l>rez) rez=l;
	}
	printf("%d\n",rez);
	return 0;
}