Cod sursa(job #522746)

Utilizator indestructiblecont de teste indestructible Data 16 ianuarie 2011 00:20:12
Problema Substr Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <stdio.h>
#define NMAX 16505
#define MOD1 100007
#define MOD2 100021
#define P 73
#define ll long long
int n,k,B[NMAX],C[NMAX],P1[NMAX],P2[NMAX];
int D[MOD1],E[MOD2],F[NMAX],G[NMAX],r;
char A[NMAX];
void precompute()
{
	int i;
	P1[0]=1; P2[0]=1;
	for (i=1; i<=n; i++)
	{
		B[i]=(B[i-1]*P+A[i])%MOD1;
		C[i]=(C[i-1]*P+A[i])%MOD2;
		P1[i]=(P1[i-1]*P)%MOD1;
		P2[i]=(P2[i-1]*P)%MOD2;
	}
}
inline int code1(int st,int dr)
{
	int act1,act2;
	act1=((ll)B[st-1]*P1[dr-st+1])%MOD1;
	act2=B[dr]-act1;
	if (act2<0) 
		act2+=MOD1;
	return act2;
}
inline int code2(int st,int dr)
{
	int act1,act2;
	act1=((ll)C[st-1]*P2[dr-st+1])%MOD2;
	act2=C[dr]-act1;
	if (act2<0) 
		act2+=MOD2;
	return act2;
}
int ok(int val)
{
	int i,found=0;
	r=0;
	for (i=1; i<=n-val+1; i++)
	{
		F[++r]=code1(i,i+val-1);
		G[r]=code2(i,i+val-1);
		D[F[r]]++;
		E[G[r]]++;
	}
	for (i=1; i<=r; i++)
		if (D[F[i]]>=k && E[F[i]]>=k)
		{
			found=1;
			break ;
		}
	for (i=1; i<=r; i++)
	{
		D[F[i]]--;
		E[G[i]]--;
	}
	return found;
}
int cbin()
{
	int i,step=1;
	for (step=1; step<=n; step<<=1);
	for (i=0; step; step>>=1)
		if (i+step<=n && ok(i+step))
			i+=step;
	return i;
}
int main()
{
	freopen("substr.in","r",stdin);
	freopen("substr.out","w",stdout);
	scanf("%d%d\n",&n,&k);
	fgets(A+1,NMAX,stdin);
	precompute();
	printf("%d\n",cbin());
	return 0;
}