Cod sursa(job #220119)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 9 noiembrie 2008 14:57:02
Problema Substr Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <stdio.h>

const int MOD = 666013;

int N, K, f[700000], p[17005];
char s[17005];

void precalculez()
{
	p[0] = 1;
	for (int i = 1; i <= N; i++) p[i] = (p[i - 1] * 71) % MOD;
}

void init()
{
	for (int i = 0; i <= 666013; i++) f[i] = 0;
}

int solve(int X)
{
	int i, x = 0, max = 0;
	for (i = 0; i < X; i++) x = ( x + ((s[i] - 'a') * p[X - i - 1]) % MOD) % MOD;
	f[x]++;
	if (max < f[x]) max = f[x];
	for (; i < N; i++)
	{
		x -= ((s[i - X] - 'a') * p[X - 1]) % MOD;
		x = x % MOD;
		while (x < 0) x += MOD;
		x *= 71;
		x = x % MOD;
		x += (s[i] - 'a');
		x = x % MOD;
		f[x]++;

		if (max < f[x]) max = f[x];
	}
	if (max >= K) return 1;
	return 0;
}


int main()
{
	freopen("substr.in","r",stdin);
	freopen("substr.out","w",stdout);

	int rez = 0;
	scanf("%d %d",&N,&K);
	scanf("%s",s);

	precalculez();
	int p, u, m, x1, x2;
	p = 1; u = N;
	
	while (p <= u)
	{
		m = (p + u) / 2;
		init();
		x1 = solve(m);
		init();
		x2 = solve(m + 1);
		if (x1 && !x2)
		{
			rez = m;
			break;
		}
		else if (x2)
		{
			p = m + 1;
		}
		else if (!x1)
		{
			u = m - 1;
		}
	}
	printf("%d\n",rez);
	return 0;
}