Cod sursa(job #543687)

Utilizator hadesgamesTache Alexandru hadesgames Data 28 februarie 2011 14:58:55
Problema Substr Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define nmax 16400
FILE *in,*out;
int a[17][nmax],c[nmax],coada[nmax],put,n;
pair<pair<int,int> ,int > b[nmax];
pair<int,int> d[nmax];
char s[nmax];

int lcp(int x,int y)
{
	int rez=0,i;
	for (i=put;i>=1;i--)
	{
		if (a[i][x]==a[i][y])
		{
			rez+=(1<<i);
			x+=(1<<i);
			y+=(1<<i);
			if (y>n|| x> n)
				return rez;
		}
	}
	return rez;
}
int main()
{
	int k,i,j,p,u,rez;
	in=fopen("substr.in","r");
	out=fopen("substr.out","w");
	
	fscanf(in,"%d%d",&n,&k);
	fscanf(in,"%s",s+1);
	if (k==1)
	{
		fprintf(out,"%d\n",n);
		fclose(in);
		fclose(out);
		return 0;
	}
	for (i=1;i<=n;i++)
		a[0][i]=s[i];
	for (i=1;(1<<(i-1))<=n;i++)
	{
		for (j=1;j<=n;j++)
		{
			b[j].fi.fi=a[i-1][j];
			b[j].fi.se=(1<<(i-1))+j>n?-1:a[i-1][j+(1<<(i-1))];
			b[j].se=j;
		}
		sort(b+1,b+n+1);
		a[i][b[1].se]=1;
		for (j=2;j<=n;j++)
			if (b[j].fi==b[j-1].fi)
				a[i][b[j].se]=a[i][b[j-1].se];
			else
				a[i][b[j].se]=a[i][b[j-1].se]+1;		
	}
	put=i-1;
	for (i=1;i<=n;i++)
		d[i]=mp(a[put][i],i);
	sort(d+1,d+n+1);
	for (i=2;i<=n;i++)
		c[i]=lcp(d[i-1].se,d[i].se);
	k--;
	p=1;
	u=0;
	rez=-1;
	for (i=2;i<=n;i++)
	{
		if (i-coada[p]==k)
			rez=max(rez,c[coada[p]]);
		while (p<=u && i-coada[p]>=k)
			p++;
		while (p<=u && c[coada[u]]>c[i])
			u--;
		u++;
		coada[u]=i;
	}
	fprintf(out,"%d\n",rez);
	fclose(in);
	fclose(out);
	return 0;
}