Pagini recente » Cod sursa (job #2607802) | Cod sursa (job #2140609) | Cod sursa (job #1086800) | Cod sursa (job #473929) | Cod sursa (job #1198330)
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
struct sp {
int a, b, p;
sp(int _a = 0, int _b = 0, int _p = 0) {
a = _a;
b = _b;
p = _p;
}
inline bool operator < (const sp &x) const {
if(a == x.a) {
return b < x.b;
}
return a < x.a;
}
inline bool operator == (const sp &x) const {
return a == x.a && b == x.b;
}
};
const int MAX_N = 16500;
const int MAX_L = 20;
int d[MAX_L][MAX_N];
sp v[MAX_N];
string s;
int n;
int l;
void pregen() {
for(int i = 0; i < n; i++) {
d[0][i] = s[i];
}
for(l = 1; (1 << (l - 1)) < n; l++) {
for(int i = 0; i < n; i++) {
if(i + (1 << (l - 1)) < n) {
v[i] = sp(d[l - 1][i], d[l - 1][i + (1 << (l -1))], i);
}
else {
v[i] = sp(d[l - 1][i], -1, i);
}
}
sort(v, v + n);
for(int i = 0; i < n; i++) {
if(i && v[i] == v[i - 1]) {
d[l][v[i].p] = d[l][v[i - 1].p];
}
else {
d[l][v[i].p] = i;
}
}
}
}
int LCP(int i, int j) {
int ans = 0;
for(int pas = l - 1; pas >= 0 && i < n && j < n; pas--) {
if(d[pas][i] == d[pas][j]) {
i += (1 << pas);
j += (1 << pas);
ans += (1 << pas);
}
}
return ans;
}
int main() {
int k;
fin >> n >> k;
fin >> s;
pregen();
int ans = 0;
for(int i = k - 1; i < n; i++) {
ans = max(ans, LCP(v[i].p, v[i - k + 1].p));
}
fout << ans;
return 0;
}