Pagini recente » Cod sursa (job #2948734) | Cod sursa (job #2771506) | Cod sursa (job #2541025) | Cod sursa (job #3276677) | Cod sursa (job #1075459)
#include <cstdio>
#include <algorithm>
#define MAXN 16500
#define MAXLOG 17
using namespace std;
struct lol {
int nr[2], pos;
} L[MAXN];
int P[MAXLOG][MAXN], step;
int N, K, sol;
char s[MAXN];
inline bool cmp(const lol &a, const lol &b) {
return a.nr[0] == b.nr[0] ? a.nr[1] < b.nr[1] : a.nr[0] < b.nr[0];
}
inline int lcp(int x, int y) {
if(x == y) return N - x;
int res = 0;
for(int i = step; i >= 0 && x < N && y < N; i--) {
// printf("%d %d %d\n", i, P[i][x], P[i][y]);
if(P[i][x] == P[i][y]) {
int v = (1 << i);
// printf("%d %d %d %d %d %d\n", i, x, y, v, P[i][x], P[i][y]);
x += v;
y += v;
res += v;
}
}
return res;
}
int main() {
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d %d\n", &N, &K);
fgets(s, MAXN, stdin);
for(int i = 0; i < N; i++)
P[0][i] = s[i] - 'a';
int cnt;
for(step = 1, cnt = 1; (cnt >> 1) < N; cnt <<= 1, step++) {
for(int i = 0; i < N; i++) {
//unite the bastards
L[i].nr[0] = P[step - 1][i];
if(i + cnt < N) L[i].nr[1] = P[step - 1][i + cnt];
else L[i].nr[1] = -1;
L[i].pos = i;
}
sort(L, L + N, cmp);
//make sure of duplicates
for(int i = 0; i < N; i++)
P[step][L[i].pos] = i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[step][L[i - 1].pos] : i;
}
step -= 1;
#ifdef DEBUG
printf("%d\n", step);
for(int i = 0; i < N; i++)
printf("%d ", L[i].pos);
printf("\n");
printf("%d\n", lcp(2, 11));
return 0;
#endif
for(int i = 0; i < N - K + 1; i++) {
// printf("%d\n", L[i].pos);
sol = max(sol, lcp(L[i].pos, L[i + K - 1].pos));
}
printf("%d\n", sol);
return 0;
}