Pagini recente » Cod sursa (job #2081952) | Cod sursa (job #3325070) | Cod sursa (job #2514816) | Cod sursa (job #2668433) | Cod sursa (job #1695853)
#include <fstream>
#include <algorithm>
#include <cstring>
#define pi pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;
ifstream in("substr.in");
ofstream out("substr.out");
const int N = 20000;
const int LOG = 16;
int n, k;
int sa[LOG][2 * N];
pair<pair<int, int>, int> crt[N];
string str;
void buildSuffArr() {
int i, j;
pair<int, int> pe;
memset(sa, -1, sizeof(sa));
for(i = 0; i < n; i++) {
sa[0][i] = str[i];
}
for(i = 0; i < LOG - 1; i++) {
for(j = 0; j < n; j++) {
crt[j].first = make_pair(sa[i][j], sa[i][j + (1 << i)]);
crt[j].second = j;
}
sort(crt, crt + n);
for(j = 1; j < n; j++) {
sa[i + 1][crt[j].second] = sa[i + 1][crt[j - 1].second];
if(crt[j].first != crt[j - 1].first) sa[i + 1][crt[j].second]++;
}
}
}
int lcp(int i, int j) {
int q = 0, p;
for(p = LOG - 1; p >= 0; p--) {
if(max(i, j) + (1 << p) <= n) {
if(sa[p][i] == sa[p][j]) {
q |= (1 << p);
i += (1 << p);
j += (1 << p);
}
}
}
return q;
}
int main() {
int i;
in >> n >> k >> str;
buildSuffArr();
int best = 0;
for(i = 0; i < n - k; i++) {
best = max(best, lcp(crt[i].second, crt[i + k - 1].second));
}
out << best << '\n';
return 0;
}