Cod sursa(job #2739879)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 10 aprilie 2021 14:37:54
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <fstream>
#include <unordered_map>
using namespace std;

ifstream fin ("substr.in");
ofstream fout ("substr.out");

const int r = 1000000007;

char c[17001];
int p[17001];
unordered_map <int, int> m;

bool verif (int lg, int n, int k)
{
	int i;
	m.clear();
	int hash = 0;
	for (i = 0; i<lg; i++)
		hash = (hash + 1ll * p[lg-i-1] * c[i]) % r;
	++m[hash];
	for (i = lg; i<n; i++)
	{
		hash = (131ll * (hash - 1ll * p[lg-1] * c[i-lg] % r + r) + c[i])%r;
		++m[hash];
	}
	for (unordered_map <int, int>::iterator it = m.begin(); it != m.end(); it++)
		if (it -> second >= k)
			return 1;
	return 0;
}

int main()
{
	int n, k, i, st, dr, mij;
	fin >> n >> k;
	fin >> c;
	//baza hash-ului va fi 131
	p[0] = 1;
	for (i = 1; i<=n; i++)
		p[i] = 131ll * p[i-1] % r;
	st = 0;
	dr = n;
	while (st <= dr)
	{
		mij = (st+dr)>>1;
		if (verif(mij, n, k) == 1)
			st = mij + 1;
		else
			dr = mij - 1;
	}
	fout << dr;
	return 0;
}