Pagini recente » Cod sursa (job #1712648) | Cod sursa (job #2950558) | Cod sursa (job #642757) | Cod sursa (job #2306075) | Cod sursa (job #2844112)
#include <stdio.h>
#include <cstring>
#include <map>
const int MAX_N = 16384;
const int B = 257;
const int P = 1e9 + 7;
int prefH[1 + MAX_N], powerB[1 + MAX_N];
std::map<int, int> mp;
int k;
int rangeHash(int l, int r) {
return (prefH[r] - (long long)prefH[l - 1] * powerB[r - l + 1] % P + P) % P;
}
bool ok(int n, int l) {
mp.clear();
for (int i = 1; i + l - 1 <= n; i++) {
mp[rangeHash(i, i + l - 1)]++;
}
for (const auto &it : mp) {
if (it.second >= k) {
return true;
}
}
return false;
}
int cb(int n) {
int st = 1, dr = n, sol = 0;
while (st <= dr) {
int mijl = (st + dr) / 2;
if (ok(n, mijl)) {
sol = mijl;
st = mijl + 1;
} else {
dr = mijl - 1;
}
}
return sol;
}
int main() {
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int n;
char* S = new char[1 + MAX_N];
scanf("%d%d%s", &n, &k, S);
for (int i = 1; i <= n; i++) {
prefH[i] = ((long long)prefH[i - 1] * B + S[i - 1] - 'a') % P;
}
powerB[0] = 1;
for (int i = 1; i <= n; i++) {
powerB[i] = (long long)powerB[i - 1] * B % P;
}
int answer = cb(n);
printf("%d", answer);
return 0;
}