Cod sursa(job #1053706)

Utilizator Robert29FMI Tilica Robert Robert29 Data 12 decembrie 2013 21:52:01
Problema Substr Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2013 Marime 1.29 kb
#include <stdio.h>
#include <unordered_map>
#define baza 131
#define mod 9500041
using namespace std;
FILE*f = fopen("substr.in", "r");
FILE*g = fopen("substr.out", "w");
int n, k;
char v[20001];
unordered_map <int, int> h;
long long X, Y;
void euclid(int a, int b, long long &x, long long &y){
	if (!b){
		x = 1;
		y = 0;
		return;
	}
	else{
		long long  x0, y0;
		euclid(b, a%b, x0, y0);
		x = y0;
		y = x0 - (a / b)*y0;
	}

}
long long  invers(int a)
{
	X = Y = 0;
	euclid(a, mod, X, Y);
	while (X <= 0)
		X = mod + X%mod;

	return X;
}
int main()
{
	fscanf(f, "%d%d\n", &n, &k);
	fgets(v + 1, n + 3, f);

	int p = 0;
	int u = n;
	int BAZA = invers(baza);
	while (p <= u)
	{
		int ok = 0;
		int m = (p + u) / 2;
		int b = 1;
		long long nr = 0;
		nr = v[1];
		for (int i = 2; i <= m; ++i)
		{
			b *= baza;
			b %= mod;
			nr += v[i] * b;
			nr %= mod;

		}

		h[nr]++;

		if (k == 1)
			ok = 1;
		for (int i = m + 1; !ok&&i <= n; ++i)
		{
			nr += mod - v[i - m];
			nr %= mod;
			nr *= BAZA;
			nr %= mod;
			nr += v[i] * b;
			nr %= mod;
			h[nr]++;

			if (h[nr] >= k)
			{
				ok = 1;

			}
		}
		if (ok)
			p = m + 1;
		else
			u = m - 1;
		h.clear();
	}

	fprintf(g, "%d", u);


	fclose(f);
	fclose(g);
	return 0;
}