Pagini recente » Cod sursa (job #3126566) | Cod sursa (job #176664) | Cod sursa (job #758973) | Cod sursa (job #80518) | Cod sursa (job #1467597)
#define _CRT_SECURE_NO_DEPRECATE
#include <cstdio>
#include <algorithm>
#define MAXN 1 << 15
#define LG 15
#define max(x, y) (x) > (y) ? (x) : (y)
using namespace std;
int K, N;
char A[MAXN];
int P[LG][MAXN], maxx, step, IP[MAXN];
struct entry{
int nr[2], p;
} L[MAXN];
inline bool cmp(const entry a, const entry b){
return a.nr[0] != b.nr[0] ? a.nr[0] < b.nr[0] : a.nr[1] < b.nr[1];
}
inline int LCP(int x, int y){
if (x == y) return 0;
int k = step, ret = 0;
for (; k >= 0 && x < N && y < N; --k)
if (P[k][x] == P[k][y]) x += 1 << k, y += 1 << k, ret += 1 << k;
return ret;
}
int main() {
int i;
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d %d\n", &N, &K);
gets(A);
for (int i = 0; i < N; ++i) P[0][i] = A[i] - 'a';
if (K == 1){
printf("%d\n", N);
return 0;
}
for (i = 1; 1 << (i - 1) < N; ++i){
for (int j = 0; j < N; ++j)
L[j].nr[0] = P[i - 1][j],
L[j].nr[1] = j + (1 << (i - 1)) <= N ? P[i - 1][j + (1 << (i - 1))] : -1,
L[j].p = j;
sort(L, L + N, cmp);
for (int j = 0; j < N; ++j)
P[i][L[j].p] = j && L[j].nr[0] == L[j - 1].nr[0] && L[j].nr[1] == L[j - 1].nr[1] ? P[i][L[j - 1].p] : j;
}
step = i - 1;
for (i = 0; i < N; ++i) IP[P[step][i]] = i;
for (i = 0; i < N - K; ++i)
maxx = max(maxx, LCP(IP[i], IP[i + K - 1]));
printf("%d\n", maxx);
return 0;
}