Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/alexandrughergut | Diferente pentru runda/dau_pentru_aluprej intre reviziile 1 si 2 | Monitorul de evaluare | Cod sursa (job #2017261)
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cassert>
#include <cstring>
#include <climits>
#include <queue>
#include <ctime>
using namespace std;
typedef long long LL;
#ifdef INFOARENA
#define ProblemName "substr"
#endif
#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif
const int MAXN = 17000;
char buf[MAXN];
int N, M, K;
int h[2][MAXN];
const int modnum[2] = { 961748941, 982451653 };
int pw[2][MAXN];
const int B = 29;
void prec(int id) {
pw[id][0] = 1;
for (int i = 1; i <= N; ++i)
pw[id][i] = (int)((1LL * pw[id][i - 1] * B) % modnum[id]);
h[id][0] = buf[0] - 'a';
for (int i = 1; i < N; ++i)
h[id][i] = (int)((1LL * h[id][i - 1] * B + buf[i] - 'a') % modnum[id]);
}
int getHash(int id, int r, int L) {
int l = r - L + 1;
if (l <= 0)
return h[id][r];
int p = (int)((
h[id][r] - (1LL * h[id][l - 1] * pw[id][L]) % modnum[id]
) % modnum[id]);
if (p < 0) p += modnum[id];
return p;
}
inline bool eqAt(int id, int i, int j) {
return getHash(id, i, M) == getHash(id, j, M);
}
inline bool eqAt(int i, int j) {
return eqAt(0, i, j) && eqAt(1, i, j);
}
int nrapp(int j) {
int ans = 0;
for (int i = M - 1; i < N; ++i)
if (eqAt(i, j))
++ans;
return ans;
}
bool canDo() {
int best = 0;
for (int j = M - 1; j < N; ++j) {
int cand = nrapp(j);
if (cand > best)
best = cand;
}
return (best >= K);
}
int binSrch() {
int left = 1, right = N;
int found = 0;
while (left <= right) {
M = left + (right - left) / 2;
if (canDo()) {
found = M;
left = M + 1;
}
else
right = M - 1;
}
return found;
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OuFile, "w", stdout));
scanf("%d%d", &N, &K);
scanf("%s", buf);
prec(0); prec(1);
printf("%d\n", binSrch());
return 0;
}