Pagini recente » Cod sursa (job #880068) | Cod sursa (job #2742002) | Cod sursa (job #1269876) | Cod sursa (job #3281880) | Cod sursa (job #3258850)
#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
ifstream in ("substr.in");
ofstream out ("substr.out");
const int N_MAX = (1 << 16);
int N, K; string input;
const int MOD = 1e9 + 7;
const int BASE = 27;
int h[1 + N_MAX]; int p[N_MAX];
static inline int add (int a, int b) {
if (a + b >= MOD) return a + b - MOD;
if (a + b < 0) return a + b + MOD;
return a + b;
}
static inline int prod (int a, int b) {
int ret = (int64) a * b % MOD;
return ret;
}
void readInput (void) {
in >> N >> K; in >> input;
for (int i = 1; i <= N; i ++)
h[i] = add (prod (h[i - 1], BASE), input[i - 1] - 'a' + 1);
p[0] = 1;
for (int e = 1; e < N_MAX; e ++) p[e] = prod (p[e - 1], BASE);
}
static inline int getHash (int le, int ri) {
return add (h[ri], -prod (h[le - 1], p[ri - le + 1]));
}
map<int, int> counter;
bool valid (int len) {
int ret = 0;
for (int i = 0; i <= N - len; i ++)
counter[getHash (i, i + len - 1)] ++;
for (auto T : counter) ret = max (ret, T.second);
return (ret >= K);
}
void solve (void) {
int low = 1, high = N;
int answer = 0;
while (low <= high) {
int mid = low + (high - low) / 2;
if (valid (mid)) answer = mid, low = mid + 1;
else high = mid - 1;
}
out << answer;
}
int main()
{
readInput ();
solve ();
return 0;
}