Cod sursa(job #2155730)

Utilizator amaliarebAmalia Rebegea amaliareb Data 8 martie 2018 00:55:10
Problema Substr Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#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;
}