Pagini recente » Cod sursa (job #1013757) | Cod sursa (job #1546375) | Cod sursa (job #1959916) | Cod sursa (job #368839) | Cod sursa (job #1746890)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 22000,
LMAX = 20;
struct AUX {
int c1, c2, pos;
};
int len, lg, k;
AUX l[NMAX];
int p[LMAX][NMAX];
char str[NMAX];
bool cmp(const AUX &a, const AUX &b) {
if(a.c1==b.c1)
return a.c2<b.c2;
else
return a.c1<b.c1;
}
void make_sfx(void) {
for(int i=0; i<len; ++i)
p[0][i] = str[i];
for(lg=1; (1 << lg) < len; ++lg) {
for(int i=0; i<len; ++i) {
l[i].pos = i;
l[i].c1 = p[lg - 1][i];
if(i + (1 << lg - 1) < len)
l[i].c2 = p[lg - 1][i + (1 << lg - 1)];
else
l[i].c2 = -1;
}
sort(l, l+len, cmp);
for(int i=0; i<len; ++i) {
if(i && l[i].c1==l[i - 1].c1 && l[i].c2==l[i - 1].c2)
p[lg][l[i].pos] = p[lg][l[i-1].pos];
else
p[lg][l[i].pos] = i;
}
} --lg;
}
int lcp(int x, int y) {
int k, ret = 0;
if (x == y) return len - x;
for (k = lg - 1; k >= 0 && x < len && y < len; --k)
if (p[k][x] == p[k][y])
x += 1 << k, y += 1 << k, ret += 1 << k;
return ret;
}
int main(void) {
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int ant;
ant = 0;
scanf("%d%d ",&len,&k);
gets(str);
make_sfx();
for(int i=0; i<len-k; ++i)
ant = max(ant, lcp(l[i].pos, l[i+k-1].pos));
printf("%d\n",ant);
fclose(stdin);
fclose(stdout);
}