Pagini recente » Cod sursa (job #258327) | Cod sursa (job #945374) | Cod sursa (job #1722617) | Cod sursa (job #2450354) | Cod sursa (job #2053632)
#include <cstdio>
#include <algorithm>
using namespace std;
struct Label {
int nr1, nr2, poz;
bool operator < (Label other) const {
if(nr1 == other.nr1) {
return nr2 < other.nr2;
}
return nr1 < other.nr1;
}
bool operator == (Label other) const {
return nr1 == other.nr1 && nr2 == other.nr2;
}
};
char s[17000];
int P[20][17000], cnt, stp;
Label L[17000];
int myCharToInt(char x) {
if('0' <= x && x <= '9') {
return x - '0';
} else if('a' <= x && x <= 'z') {
return x - 'a' + 10;
} else {
return x - 'A' + 36;
}
}
int lcp(int x, int y, int n) {
int sol = 0;
if(x == y) {
return n - x;
}
for(int k = stp - 1; k >= 0 && x < n && y < n; -- k) {
if(P[k][x] == P[k][y]) {
x += (1 << k);
y += (1 << k);
sol += (1 << k);
}
}
return sol;
}
int main() {
freopen("substr.in", "r", stdin);
freopen("substr.out", "w", stdout);
int n, k;
scanf("%d%d\n", &n, &k);
gets(s);
for(int i = 0; i < n; ++ i) {
P[0][i] = myCharToInt(s[i]);
}
for(cnt = 1, stp = 1; (cnt >> 1) < n; cnt <<= 1, ++ stp) {
for(int i = 0; i < n; ++ i) {
L[i] = {P[stp - 1][i], i + cnt < n ? P[stp - 1][i + cnt] : -1, i};
}
sort(L, L + n);
for(int i = 0; i < n; ++ i) {
P[stp][L[i].poz] = i;
if(i > 0 && L[i] == L[i - 1]) {
P[stp][L[i].poz] = P[stp][L[i - 1].poz];
}
}
}
int rasp = 0;
for(int i = 0; i + k - 1 < n; ++ i) {
int aux = lcp(L[i].poz, L[i + k - 1].poz, n);
if(aux > rasp) {
rasp = aux;
}
}
printf("%d\n", rasp);
return 0;
}