Pagini recente » Cod sursa (job #2496764) | Cod sursa (job #2108686) | Cod sursa (job #2155730)
#include <bits/stdc++.h>
using namespace std;
ifstream f("substr.in");
ofstream g("substr.out");
const int MaxN = 16500, LOG = 14;
int n, k, suff[LOG + 1][2 * MaxN];
char s[MaxN];
struct miau{int x, y, poz;} v[MaxN];
deque<int> dq;
bool cmp(miau a, miau b) {
if (a.x == b.x) return a.y < b.y;
return a.x < b.x;
}
int lcp(int a, int b) {
int pas = LOG, rez = 0;
while (pas >= 0) {
if (suff[pas][a] == suff[pas][b]) rez += (1 << pas), a += (1 << pas), b += (1 << pas);
--pas;
}
return rez;
}
int main()
{
f >> n >> k;
f >> (s + 1);
for (int i = 1; i <= n; ++i) suff[0][i] = s[i];
for (int pas = 1; pas <= LOG; ++pas) {
for (int i = 1; i <= n; ++i) v[i] = {suff[pas - 1][i], suff[pas - 1][i + (1 << (pas - 1))], i};
sort(v + 1, v + n + 1, cmp);
suff[pas][v[1].poz] = 1;
int nr = 1;
for (int i = 2; i <= n; ++i) {
if (v[i].x != v[i - 1].x || v[i].y != v[i - 1].y) ++nr;
suff[pas][v[i].poz] = nr;
}
}
int ans = 0;
--k;
for (int i = 2; i <= k + 1; ++i) {
int val = lcp(v[i].poz, v[i - 1].poz);
while (!dq.empty() && dq.back() > val) dq.pop_back();
dq.push_back(val);
ans = max(ans, dq.front());
}
for (int i = k + 2; i <= n; ++i) {
int val = lcp(v[i].poz, v[i - 1].poz);
if (lcp(v[i - k].poz, v[i - k - 1].poz) == dq.front()) dq.pop_front();
while (!dq.empty() && dq.back() > val) dq.pop_back();
dq.push_back(val);
ans = max(ans, dq.front());
}
g << ans << '\n';
return 0;
}