Pagini recente » Cod sursa (job #2269295) | Cod sursa (job #436264) | Cod sursa (job #713531) | Cod sursa (job #2742006) | Cod sursa (job #597619)
Cod sursa(job #597619)
#include <cstdio>
#include <algorithm>
using namespace std;
struct elem {
int poz, nr[2];
};
const int logN = 15, N = 16400;
elem v[N];
int n, k, logc, P[logN][N];
char s[N];
void read() {
scanf("%d%d\n", &n, &k);
gets(s);
}
bool comp(const elem &A, const elem &B) {
return (A.nr[0] == B.nr[0]) ? (A.nr[1] < B.nr[1]) : (A.nr[0] < B.nr[0]);
}
void suffix_arrays() {
for (int i = 0; i < n; ++ i)
P[0][i] = s[i] - 'a';
for (int j = 1, p2 = 1; (p2 >> 1) < n; ++ j, p2 <<= 1) {
for (int i = 0; i < n; ++ i) {
v[i].nr[0] = P[j - 1][i];
if (i + p2 < n)
v[i].nr[1] = P[j - 1][i + p2];
else
v[i].nr[1] = - 1;
v[i].poz = i;
}
sort(v + 1, v + n + 1, comp);
int ic = - 1;
P[j][v[0].poz] = ++ ic;
for (int i = 1; i < n; ++ i)
if (v[i].nr[0] == v[i - 1].nr[0] && v[i].nr[1] == v[i - 1]. nr[1])
P[j][v[i].poz] = ic;
else
P[j][v[i].poz] = ++ ic;
logc = j - 1;
}
}
int lcp(int x, int y) {
if (x == y)
return n - x;
int lung = 0;
for (int k = logc; k >= 0 && x < n && y < n; -- k)
if (P[k][x] == P[k][y])
x += (1 << k), y += (1 << k), lung += (1 << k);
return lung;
}
void solve() {
int rez = - 1;
for (int i = 0; i < n - k; ++ i) {
int lcpc = lcp(v[i].poz, v[i + k - 1].poz);
if (lcpc > rez)
rez = lcpc;
}
printf("%d\n", rez);
}
int main() {
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
read();
suffix_arrays();
solve();
return 0;
}