Cod sursa(job #528834)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 3 februarie 2011 15:50:18
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Nmax 17000
#define x first
#define y second


using namespace std;

//struct sir
//{
//	int nr1,nr2,poz;
//} b[Nmax];

int n,nr=0,i,j,a[25][Nmax],k,q,maxx,sol;
pair <pair <int, int>, int>  b[Nmax];
char s[Nmax];


//bool cmp(sir x,sir y)
//{
//	if ((x.nr1>y.nr1)||(x.nr1==y.nr1&&x.nr2>y.nr2)) return 0;
//	return 1;
//}

int lcp(int x,int y)
{
	int rez=0;
	if (x==y) return n-x;
	for (int i=nr;i>=0&&x<n&&y<n;i--)
		if (a[i][x]==a[i][y])
		{
			rez+=1<<i;
			x+=1<<i;
			y+=1<<i;
		}
	return rez;
}

int main()
{
	freopen("substr.in","r",stdin);
	freopen("substr.out","w",stdout);
	
	scanf("%d%d\n",&n,&q);
	
	fgets(s,n+3,stdin);
	
	for (i=0;i<n;i++)
		a[0][i]=s[i]-'a';
	
	for (i=1;i*2<n;i=i*2)
	{
		for (k=0;k<n;k++)
		{
			b[k].x.x=a[nr][k];
			if (k+i<n) b[k].x.y=a[nr][k+i];
				else b[k].x.y=-1;
			b[k].y=k;
		}
		
		sort(b,b+n);
		
		nr++;
		for (k=0;k<n;k++)
			if (k!=0&&b[k].x.x==b[k-1].x.x&&b[k].x.y==b[k-1].x.y) a[nr][b[k].y]=a[nr][b[k-1].y];
				else a[nr][b[k].y]=k;
		
	}
	
	for (i=0;i<=n-q;i++)
	{
		sol=lcp(b[i].y,b[i+q-1].y);
		if (sol>maxx) maxx=sol;
	}
	printf("%d\n",maxx);
	return 0;
}