Cod sursa(job #717348)

Utilizator Robert29FMI Tilica Robert Robert29 Data 19 martie 2012 20:54:50
Problema Substr Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
FILE*f=fopen("substr.in","r");
FILE*g=fopen("substr.out","w");
int x,y,z,maxx,P[20001],pp[22],a[20001][17],n,k,p[16][16400],cnt,stp,w[16400];
char v[16400];
struct sir
{
	int i1,i2,i;
}L[16400];
int cmp(sir a,sir b)
{
	if(a.i1==b.i1)
		return a.i2<b.i2;
	return a.i1<b.i1;
}
int lcp(int x,int y)
{
	int k,sol=0;
	for(k=stp-1;k>=0&&x<=n&&y<=n;--k)
		if(p[k][x]==p[k][y])
		{
			x+=1<<k;
			y+=1<<k;
			sol+=1<<k;
		}
	return sol;
}
int main()
{
	fscanf(f,"%d%d\n",&n,&k);
	fscanf(f,"%s",v+1);
	if(k==1)
		fprintf(g,"%d",n);
		else
	{
		for(int i=1;i<=n;++i)
			p[0][i]=v[i];
		int nr;
		for(stp=1,cnt=1;cnt>>1<=n;++stp,cnt<<=1)
		{
			for(int i=1;i<=n;++i)
			{
				L[i].i1=p[stp-1][i];
				if(i+cnt<=n)
					L[i].i2=p[stp-1][i+cnt];
				L[i].i=i;
			}
			sort(L+1,L+n+1,cmp);
			nr=0;
			for(int i=1;i<=n;++i)
				if((L[i].i1==L[i-1].i1)&&(L[i].i2==L[i-1].i2))
					p[stp][L[i].i]=nr;
				else
					p[stp][L[i].i]=++nr;
		}
		
		for(int i=1;i<n;++i)
			w[i]=lcp(L[i].i,L[i+1].i);
		
		
		for(int i=2;i<=20000;++i)
			P[i]=P[i/2]+1;
		pp[0]=1;
		for(int i=1;i<=15;++i)
			pp[i]=pp[i-1]*2;
		for(int i=1;i<=n;++i)
		{
			a[i][0]=2000000000;
			a[i][1]=w[i];
		}
		for(int j=2;j<=P[n];++j)
			for(int i=1;i<=n;++i)
				a[i][j]=min(a[i][j-1],a[i+pp[j-1]][j-1]);
		
		for(int i=1;i+k-2<n;++i)
		{
			x=i;
			y=i+k-2;
			z=min(a[x][P[y-x+1]],a[y-pp[P[y-x+1]]+2][P[y-x+1]]);
			if(z>maxx)
				maxx=z;
		}
		
		fprintf(g,"%d",maxx);
	}
	fclose(f);
	fclose(g);
	return 0;
}