Pagini recente » Borderou de evaluare (job #1134103) | Cod sursa (job #2975023)
#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 = 0;
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;
}