Pagini recente » Cod sursa (job #301978) | Cod sursa (job #2620752) | Cod sursa (job #28578) | Cod sursa (job #1860968) | Cod sursa (job #2922016)
#include <bits/stdc++.h>
#define NMAX 16384
#define BASE 26
#define MOD1 666013
#define MOD2 666019
using namespace std;
ifstream fin ("substr.in");
ofstream fout ("substr.out");
int n, k;
string s;
pair <int, int> vsort[NMAX + 1];
int test(int len) {
int i, hash1, hash2, power1, power2, maxap, nsort, cnt;
hash1 = hash2 = 0;
power1 = power2 = 1;
for (i = 0; i < len - 1; i++) {
hash1 = (hash1 * BASE + s[i] - 'a') % MOD1;
hash2 = (hash2 * BASE + s[i] - 'a') % MOD2;
power1 = (power1 * BASE) % MOD1;
power2 = (power2 * BASE) % MOD2;
}
nsort = 0;
for (i = len - 1; i < n; i++) {
hash1 = (hash1 * BASE + s[i] - 'a') % MOD1;
hash2 = (hash2 * BASE + s[i] - 'a') % MOD2;
vsort[nsort++] = {hash1, hash2};
hash1 = (hash1 - (power1 * (s[i - len + 1] - 'a')) % MOD1 + MOD1) % MOD1;
hash2 = (hash2 - (power2 * (s[i - len + 1] - 'a')) % MOD2 + MOD2) % MOD2;
}
sort(vsort, vsort + nsort);
cnt = 1;
maxap = 1;
for (i = 1; i < nsort; i++) {
if (vsort[i] == vsort[i - 1])
cnt++;
else
cnt = 1;
maxap = max(maxap, cnt);
}
return maxap;
}
int bs(int st, int dr) {
int mij, sol, val;
while (st <= dr) {
mij = (st + dr) / 2;
val = test(mij);
if (val >= k) {
st = mij + 1;
sol = mij;
}
else
dr = mij - 1;
}
return sol;
}
int main() {
fin >> n >> k >> s;
fout << bs(1, n);
return 0;
}