Pagini recente » Cod sursa (job #1788615) | Cod sursa (job #1761523) | Cod sursa (job #979456) | Cod sursa (job #2276200) | Cod sursa (job #2467591)
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100005;
const int MAX_LG = 17;
int n, k;
char s[MAX_N];
int suff[MAX_LG][MAX_N];
int sorted[MAX_N];
pair < pair < int, int > , int > arr[MAX_N];
void suffixArrays() {
for (int i = 1; i <= n; ++i) {
suff[0][i] = s[i];
}
for (int step = 1; step <= 14; ++step) {
for (int i = 1; i <= n; ++i) {
if (i + (1 << (step - 1)) > n) {
arr[i] = {{suff[step - 1][i], 0}, i};
} else {
arr[i] = {{suff[step - 1][i], suff[step - 1][i + (1 << (step - 1))]}, i};
}
}
sort(arr + 1, arr + n + 1);
int p = 1;
suff[step][arr[p].second] = p;
for (int i = 2; i <= n; ++i) {
if (arr[i].first != arr[p].first) {
arr[++p] = arr[i];
}
suff[step][arr[i].second] = p;
}
for (int i = 1; i <= n; ++i) {
sorted[suff[step][i]] = i;
}
}
}
int lcp(int x, int y) {
int ans = 0;
for (int step = MAX_LG - 3; step >= 0; --step) {
if (suff[step][x] == suff[step][y]) {
ans += (1 << step);
x += (1 << step);
y += (1 << step);
}
}
return ans;
}
int main() {
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
scanf("%d %d\n", &n, &k);
for (int i = 1; i <= n; ++i) {
scanf("%c", &s[i]);
}
if (k == 1) {
printf("%d", n);
return 0;
}
suffixArrays();
int ans = 0;
for (int i = 1; i <= n - k + 1; ++i) {
ans = max(ans, lcp(sorted[i], sorted[i + k - 1]));
}
printf("%d", ans);
return 0;
}