Pagini recente » Cod sursa (job #1144191) | Cod sursa (job #1353412) | Cod sursa (job #67146) | Cod sursa (job #2307185) | Cod sursa (job #355102)
Cod sursa(job #355102)
#include <cstdio>
#include <algorithm>
#define maxn 17027
using namespace std;
struct balooba {
int f, s, p;
};
int n, i, j, k, p2, sol;
int p[20][maxn];
char s[2 * maxn];
balooba l[maxn];
int x[maxn];
bool cmp(balooba a, balooba b) {
if (a.f < b.f || (a.f == b.f && a.s < b.s))
return true;
return false;
}
bool cmp2(int a, int b) {
if (p[p2][a] < p[p2][b])
return true;
return false;
}
int lcp(int x, int y) {
int rez = 0;
if (x == y)
return n - x;
for (int cnt = p2; cnt >= 0 && x < n && y < n; cnt--)
if (p[cnt][x] == p[cnt][y]) {
x += (1 << cnt); y += (1 << cnt);
rez += (1 << cnt);
}
return rez;
}
int main(){
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d%d", &n, &k);
scanf(" %s ", s);
for (i = 0; i < n; i++)
p[0][i] = s[i] - 'a';
for (i = 1; (1 << i) <= n; i++) {
for (j = 0; j < n; j++) {
l[j].f = p[i - 1][j];
l[j].s = p[i - 1][j + (1 << (i - 1))];
l[j].p = j;
}
sort(l, l + n, cmp);
p[i][l[0].p] = 0;
for (j = 1; j < n; j++)
if (l[j].f == l[j - 1].f && l[j].s == l[j - 1].s)
p[i][l[j].p] = p[i][l[j - 1].p];
else
p[i][l[j].p] = j;
}
p2 = i - 1;
for (i = 0; i < n; i++)
x[i] = i;
sort(x, x + n, cmp2);
/* for (i = 0; i < n; i++)
printf("%d ", x[i]);
printf("\n");*/
for (i = 0; i < n - k; i++) {
// printf("%d %d %d\n", x[i], x[i + k - 1], lcp(x[i], x[i + k - 1]));
sol = max(sol, lcp(x[i], x[i + k - 1]));
}
printf("%d\n", sol);
return 0;
}