Cod sursa(job #528818)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 3 februarie 2011 15:21:47
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Nmax 16385

using namespace std;

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

int n,nr=0,i,j,a[50][Nmax],k,q,maxx,sol;
char s[Nmax];


bool cmp(sir x,sir y)
{
	if ((x.nr1>y.nr1)||(x.nr1==y.nr1&&x.nr2>y.nr1)) 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;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);
	
	gets(s);
	
	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].nr1=a[nr][k];
			if (k+i<n) b[k].nr2=a[nr][k+i];
				else b[k].nr2=-1;
			b[k].poz=k;
		}
		
		sort(b,b+n,cmp);
		
		nr++;
		for (k=0;k<n;k++)
			if (k!=0&&b[k].nr1==b[k-1].nr1&&b[k].nr2==b[k-1].nr2) a[nr][b[k].poz]=a[nr][b[k-1].poz];
				else a[nr][b[k].poz]=k;
		
	}
	
	for (i=0;i<=n-q;i++)
	{
		sol=lcp(b[i].poz,b[i+q-1].poz);
		if (sol>maxx) maxx=sol;
	}
	printf("%d\n",maxx);
	return 0;
}