Cod sursa(job #2739876)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 10 aprilie 2021 14:33:05
Problema Substr Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <fstream>
#include <map>
using namespace std;

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

const int r1 = 1000000007;
const int r2 = 1000000207;

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

bool verif (int lg, int n, int k)
{
	int i;
	m.clear();
	pair <int, int> hash = {0, 0};
	for (i = 0; i<lg; i++)
	{
		hash.first = (hash.first + 1ll * c[i] * p[lg-i-1].first) % r1;
		hash.second = (hash.second + 1ll * c[i] * p[lg-i-1].second) % r2;
	}
	++m[hash];
	for (i = lg; i<n; i++)
	{
		hash.first = (131ll * (hash.first - 1ll * p[lg-1].first * c[i-lg] % r1 + r1) + c[i]) % r1;
		hash.second = (131ll * (hash.second - 1ll * p[lg-1].second * c[i-lg] % r2 + r2) + c[i]) % r2;
		++m[hash];
	}
	for (map <pair <int, 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, 1};
	for (i = 1; i<=n; i++)
	{
		p[i].first = 131ll * p[i-1].first % r1;
		p[i].second = 131ll * p[i-1].second % r2;
	}
	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;
}