Cod sursa(job #2975028)

Utilizator Alex_HossuHossu Alexandru Alex_Hossu Data 5 februarie 2023 09:30:56
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <string>
#include <unordered_map>
#include <cmath>

typedef long long int llint;

#define chr(i) (str[i] - 'a' + 1)

#define MOD 1000000009
#define C 29

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

llint put(llint base, llint exp) {
	llint ans = 1;
	while(exp) {
		if(exp & 1) {
			ans = (ans * base) % MOD;
		}
		base = (base * base) % MOD;
		exp >>= 1;
	}
	return ans;
}

int find_max (const std::string &str, int k) {
	std::unordered_map <llint, int> cnt;
	llint hash[2] = {0, 0};

	for(int i = 0; i < k; i++) {
		hash[1] = (hash[1] * C + chr(i)) % MOD;
	}
	cnt[hash[1]]++;

	llint prec = put(C, k - 1);
	int ans = 1;
	for(int i = 0; i + k < (int)str.size(); i++) {
		hash[i & 1] = ((hash[1 ^ (i & 1)] + MOD - prec * chr(i) % MOD) * C + chr(i+k)) % MOD;
		cnt[hash[i & 1]]++;
		ans = std::max(ans, cnt[hash[i & 1]]);
	}
	return ans;
}

int main() {
	int n, k; fin >> n >> k;
	std::string str; fin >> str;

	int st = 0, dr = n + 1, mij, sol;
	while (dr - st > 1) {
		mij = (st + dr) / 2;
		if (find_max(str, mij) >= k) {
			sol = mij; st = mij;
		} else
			dr = mij;
	}
	fout << sol;

	return 0;
}