Pagini recente » Cod sursa (job #2519308) | Cod sursa (job #1498075) | Cod sursa (job #2223160) | Cod sursa (job #2599288) | Cod sursa (job #1985460)
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1 << 14;
const int MAXLOG = 15;
int mat[MAXLOG][2 * MAXN];
int n;
pair <pair <int, int>, int> suff[MAXN];
int lcp(int i, int j) {
int ans = 0;
for (int p2 = MAXLOG - 1; p2 >= 0; --p2)
if (i + (1 << p2) - 1 < n && j + (1 << p2) - 1 < n && mat[p2][i] == mat[p2][j]) {
i += (1 << p2);
j += (1 << p2);
ans += (1 << p2);
}
return ans;
}
int main()
{
int k, ans;
FILE *fin = fopen("substr.in", "r");
fscanf(fin, "%d%d ", &n, &k);
memset(mat, -1, sizeof mat);
for (int i = 0; i < n; ++i) {
fscanf(fin, "%c", &mat[0][i]);
suff[i] = {{mat[0][i], 0}, i};
}
sort(suff, suff + n);
for (int p2 = 1; (1 << p2) < n; ++p2) {
for (int i = 0; i < n; ++i)
suff[i] = {{mat[p2 - 1][i], mat[p2 - 1][i + (1 << (p2 - 1))]}, i};
sort(suff, suff + n);
mat[p2][suff[0].second] = 0;
for (int i = 1; i < n; ++i)
mat[p2][suff[i].second] = mat[p2][suff[i - 1].second] + (suff[i - 1].first != suff[i].first);
}
ans = 0;
for (int i = 0; i + k - 1 < n; ++i)
ans = max(ans, lcp(suff[i].second, suff[i + k - 1].second));
ofstream fout("substr.out");
fout << ans << '\n';
fout.close();
return 0;
}