Pagini recente » Cod sursa (job #2097814) | Cod sursa (job #1788602) | Cod sursa (job #921266) | Cod sursa (job #1209865) | Cod sursa (job #1767716)
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAXN 16500
using namespace std;
char s[MAXN];
int p[30][MAXN], lg, n, k;
int mp[MAXN];
struct elem
{
int ind, x, y;
elem(int ind = 0, int x = 0, int y = 0) : ind(ind), x(x), y(y) { }
bool operator()(elem e, elem f)
{
if (e.x != f.x) return e.x < f.x;
return e.y < f.y;
}
}e[MAXN];
void prepare()
{
for (int i = 0; i < n; i++)
p[0][i] = s[i] - 'a';
for (int i = 1, crt = 1; (crt>>1) < n; i++, crt <<= 1) {
for (int j = 0; j < n; j++) {
e[j].ind = j;
e[j].x = p[i-1][j];
if (j + crt < n) e[j].y = p[i-1][j+crt];
else e[j].y = -1;
}
sort(e, e+n, elem());
p[i][e[0].ind] = 0;
for (int j = 1; j < n; j++) {
if (e[j].x != e[j-1].x || e[j].y != e[j-1].y)
p[i][e[j].ind] = p[i][e[j-1].ind]+1;
else
p[i][e[j].ind] = p[i][e[j-1].ind];
}
lg = i;
}
for (int i = 0; i < n; i++)
mp[p[lg][i]] = i;
}
int lcp(int x, int y)
{
if (x == y) return n-x;
int k = 0;
for (int i = lg; i >= 0 && x + k < n && y + k < n; i--) {
if (p[i][x+k] == p[i][y+k]) {
k += (1<<i);
}
}
return k;
}
void solve()
{
int maxi = 0;
for (int i = 0; i+k-1 < n; i++) {
int c = lcp(mp[i], mp[i+k-1]);
maxi = max(maxi, c);
}
printf("%d", maxi);
}
int main()
{
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d %d\n", &n, &k);
gets(s);
prepare();
solve();
return 0;
}