Cod sursa(job #717331)

Utilizator Robert29FMI Tilica Robert Robert29 Data 19 martie 2012 20:38:16
Problema Substr Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 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);
	
	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-1<=n;++i)
	{
		x=i;
		y=i+k-1;
		z=min(a[x][P[y-x+1]],a[y-pp[P[y-x+1]]+1][P[y-x+1]]);
		if(z>maxx)
			maxx=z;
	}
	
	fprintf(g,"%d",maxx);
	
	fclose(f);
	fclose(g);
	return 0;
}