Pagini recente » Cod sursa (job #2972162) | Profil MihaelaCismaru | Cod sursa (job #1758531) | Cod sursa (job #1140539) | Cod sursa (job #2595759)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
const int mod(1e9 + 9), baza(67), N(17000);
int n, k, Hash[N], p[N], res, curr, st, dr, mid;
long long aux;
string s;
unordered_map<int, int> M;
inline bool Check(int l) {
M.clear();
for (int i = 0; i <= n - l; ++i) {
aux = 1LL * (Hash[i + l] + mod - Hash[i]) * p[n - i - 1];
curr = aux % mod;
++M[curr];
}
for (const auto& P : M)
if (P.second >= k)
return true;
return false;
}
inline int CHASH(char c) {
if ('a' <= c && c <= 'z')
return static_cast<int>(c - 'a');
if ('A' <= c && c <= 'Z')
return static_cast<int>(c - 'A' + 27);
if ('0' <= c && c <= '9')
return static_cast<int>(c - '0' + 54);
}
int main() {
fin >> n >> k >> s;
fin.close();
p[0] = 1;
for (int i = 1; i <= n; ++i) {
aux = 1LL * p[i - 1] * baza;
p[i] = aux % mod;
}
for (int i = 0; i < n; ++i) {
aux = Hash[i] + 1LL * CHASH(s[i]) * p[i];
Hash[i + 1] = aux % mod;
}
st = 0, dr = n;
while (st <= dr) {
mid = (st + dr) / 2;
if (Check(mid))
res = mid, st = mid + 1;
else dr = mid - 1;
}
fout << res;
fout.close();
return 0;
}