Pagini recente » Cod sursa (job #2893532) | Cod sursa (job #2276019) | Cod sursa (job #1265550) | Cod sursa (job #875170) | Cod sursa (job #2327092)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 16384;
char s[1 + MAXN + 4];
int hash1[MAXN + 1];
int put[MAXN + 1];
const int MOD = 1e9 + 7;
int n, k;
bool check (int l) {
int sol = 1;
unordered_map <int, int> f;
f[hash1[l]]++;
for(int i = l + 1; i <= n; i++) {
int h = (hash1[i] - (1LL * hash1[i - l] * put[l]) % MOD + MOD) % MOD;
f[h]++;
}
for(auto it : f)
sol = max(sol, it.second);
return (sol >= k);
}
int main() {
int st, dr, sol, mij;
freopen ("substr.in", "r", stdin);
freopen ("substr.out", "w", stdout);
scanf ("%d%d", &n, &k);
cin >> s + 1;
put[0] = 1;
for(int i = 1; i <= n; i++) {
put[i] = 1LL * put[i - 1] * 26 % MOD;
hash1[i] = (1LL * hash1[i - 1] * 26 + s[i] - 'a') % MOD;
}
st = 1;
dr = n;
sol = -1;
while (st <= dr) {
mij = (st + dr) / 2;
if (check (mij) == true) {
st = mij + 1;
sol = mij;
}
else
dr = mij - 1;
}
printf ("%d\n", sol);
return 0;
}