Pagini recente » Cod sursa (job #1217802) | Cod sursa (job #2192793) | Cod sursa (job #866280) | Cod sursa (job #1547548) | Cod sursa (job #1007036)
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 16385;
const int MAXLG = 16;
struct elem {
int nr[2], poz;
} L[MAXN];
int N, K, st, order[MAXN];
int P[MAXLG][MAXN];
char s[MAXN];
void read()
{
freopen("substr.in","r",stdin);
scanf("%d %d\n", &N, &K);
scanf("%s", &s);
}
bool cmp(const elem& a, const elem& b)
{
return (a.nr[0] < b.nr[0]) || (a.nr[0] == b.nr[0] && a.nr[1] < b.nr[1]);
}
bool cmp2(const int& i1, const int& i2)
{
return P[st][i1] < P[st][i2];
}
void suffix_array()
{
for (int i = 0; i < N; ++i)
P[0][i] = s[i] - 'a';
int cnt;
for (st = 1, cnt = 1; cnt >> 1 < N; ++st, cnt <<= 1) {
for (int i = 0; i < N; ++i) {
L[i].nr[0] = P[st - 1][i];
L[i].nr[1] = i + cnt < N ? P[st - 1][i + cnt] : -1;
L[i].poz = i;
}
sort(L, L + N, cmp);
for (int i = 0; i < N; ++i)
P[st][L[i].poz] = (i > 0 && L[i].nr[0] == L[i-1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[st][L[i-1].poz] : i);
}
}
int LCP(int x, int y)
{
int ret = 0, k;
if (x == y) return N - x;
for (k = st; k >= 0; --k) {
if (P[k][x] == P[k][y])
ret += 1 << k,
x += 1 << k,
y += 1 << k;
}
return ret;
}
int main()
{
read();
suffix_array();
st--;
for (int i = 0; i < N; ++i)
order[i] = i;
sort(order, order + N, cmp2);
int sol = 0;
for (int i = 0; i < N - K; ++i) {
sol = max(sol, LCP(order[i], order[i + K - 1]));
}
freopen("substr.out","w",stdout);
printf("%d\n", sol);
return 0;
}