Pagini recente » Cod sursa (job #1464961) | Cod sursa (job #2959762) | Cod sursa (job #1265794) | Cod sursa (job #2390170) | Cod sursa (job #2385436)
#include<bits/stdc++.h>
#define Max(a, b) (a < b) ? b : a
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
const int MAXN = 16390;
const int MAXLG = 15;
char A[MAXN];
struct entry {
int nr[2], p;
} L[MAXN];
int P[MAXLG][MAXN], N, i, stp, cnt, K, sol, sorted[MAXN];
int lcp(int x, int y) {
int k, ret = 0;
if (x == y) {
return N;
}
for (k = stp - 1; 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;
}
bool cmp(const entry &a, const entry &b) {
return a.nr[0] == b.nr[0] ? (a.nr[1] < b.nr[1]) : (a.nr[0] < b.nr[0]);
}
int main() {
in >> N >> K;
in >> A;
for (i = 0; i < N; ++i) {
P[0][i] = A[i] - 'a';
}
for (stp = 1, cnt = 1; cnt >> 1 < N; ++stp, cnt <<= 1) {
for (i = 0; i < N; ++i) {
L[i].nr[0] = P[stp - 1][i];
L[i].nr[1] = i + cnt < N ? P[stp - 1][i + cnt] : -1;
L[i].p = i;
}
sort(L, L + N, cmp);
for (i = 0; i < N; ++i) {
P[stp][L[i].p] =
i > 0 && L[i].nr[0] == L[i - 1].nr[0] && L[i].nr[1] == L[i - 1].nr[1] ? P[stp][L[i - 1].p] : i;
}
}
for (i = 0; i < N; i++) {
sorted[P[stp - 1][i]] = i;
}
for (i = 0; i <= N - K; i++) {
sol = Max(sol, lcp(sorted[i], sorted[i + K - 1]));
}
out << sol << '\n';
return 0;
}