Cod sursa(job #718470)

Utilizator Robert29FMI Tilica Robert Robert29 Data 20 martie 2012 20:27:30
Problema Substr Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 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)
		{
			int xx=lcp(L[i].i,L[i+k-1].i);
			if(xx>maxx)
				maxx=xx;
		}
		
		fprintf(g,"%d",maxx);
	}
	fclose(f);
	fclose(g);
	return 0;
}