Cod sursa(job #1419879)

Utilizator vladrochianVlad Rochian vladrochian Data 17 aprilie 2015 00:09:54
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <fstream>
#include <unordered_map>
using namespace std;

const int kMaxN = 16390;
const int kMaxLg = 15;

int N, K;
char a[kMaxN];

int lg2[kMaxN];
int hsh[kMaxLg][kMaxN];
unordered_map<int, int> cnt;

int Hash(int a, int b) {
	return (a * 479001599LL + b * 433494437LL) % 39916801;
}

void MakeHash() {
	for (int i = 2; i < kMaxN; ++i)
		lg2[i] = lg2[i >> 1] + 1;

	for (int i = 1; i <= N; ++i)
		hsh[0][i] = a[i];

	for (int i = 1; i < kMaxLg; ++i)
		for (int j = 1; j <= N - (1 << i) + 1; ++j)
			hsh[i][j] = Hash(hsh[i - 1][j], hsh[i - 1][j + (1 << (i - 1))]);
}

bool Check(int len) {
	cnt.clear();
	int lg = lg2[len];

	for (int i = 1; i <= N - len + 1; ++i) {
		int crt = Hash(hsh[lg][i], hsh[lg][i + len - (1 << lg)]);
		++cnt[crt];
		if (cnt[crt] == K)
			return true;
	}

	return false;
}

int Solve() {
	int ans = 0;
	for (int step = 1 << kMaxLg; step; step >>= 1)
		if (Check(ans | step))
			ans |= step;
	return ans;
}

int main() {
	ifstream("substr.in") >> N >> K >> (a + 1);
	MakeHash();
	ofstream("substr.out") << Solve() << "\n";
	return 0;
}