Pagini recente » Cod sursa (job #1126076) | Cod sursa (job #770548) | Cod sursa (job #96469) | Cod sursa (job #1020728) | Cod sursa (job #1574997)
#include <fstream>
#include <cstring>
#include <algorithm>
#define DIM 16390
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");
char s[DIM];
int suf[20][DIM], lg, n, K;
struct data{
int x;
int y;
int pos;
}codes[DIM];
pair<int, int> ord[DIM];
bool cmp(const data &a, const data &b) {
return ((a.x != b.x) ? (a.x < b.x) : (a.y < b.y));
}
bool cmp2(const pair<int, int> &a, const pair <int, int> &b) {
return a.first < b.first;
}
int lcp(int a, int b) {
int res = 0;
for (int k = lg; k >= 0 && a < n && b < n; k--) {
if (suf[k][a] != suf[k][b])
continue;
a += (1 << k);
b += (1 << k);
res += (1 << k);
}
return res;
}
int main() {
fin >> n >> K;
fin.get();
fin.get(s, DIM - 1);
for (int i = 0; i < n; i++)
suf[0][i] = s[i];
for (int step = 1; (1 << (step - 1)) < n; step++) {
lg = step;
for (int i = 0; i < n; i++) {
codes[i].x = suf[step - 1][i];
codes[i].y = i + (1 << (step - 1)) < n ? suf[step - 1][i + (1 << (step - 1))] : -1;
codes[i].pos = i;
}
sort(codes, codes + n, cmp);
suf[step][codes[0].pos] = 0;
for (int i = 1; i < n; i++) {
if (codes[i - 1].x == codes[i].x && codes[i - 1].y == codes[i].y)
suf[step][codes[i].pos] = suf[step][codes[i - 1].pos];
else
suf[step][codes[i].pos] = i;
}
for (int i = 0; i < n; i++)
ord[i] = make_pair(suf[step][i], i);
}
sort(ord, ord + n, cmp2);
int solution = 0;
for (int i = 0; i + K - 1 < n; i++) {
solution = max(solution, lcp(ord[i].second, ord[i + K - 1].second));
}
fout << solution << "\n";
return 0;
}
//Miriam e tare!