Cod sursa(job #3332444)

Utilizator brianabucur11Briana Bucur brianabucur11 Data 6 ianuarie 2026 18:52:28
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ("substr.in");
ofstream fout ("substr.out");

const int nmax = 2e4;

string s;

int n, k, gap, sa[nmax], poz[nmax], tmp[nmax];

bool sufCmp (int i, int j)
{
    if (poz[i] != poz[j])
        return poz[i] < poz[j];
    i += gap;
    j += gap;
    return i < n && j < n ? poz[i] < poz[j] : i > j;
}

void buildSuffixArray ()
{
    n = s.size ();
    for (int i = 0; i < n; i++)
    {
        sa[i] = i;
        poz[i] = s[i];
    }
    for (gap = 1; ; gap *= 2)
    {
        sort (sa, sa + n, sufCmp);
        for (int i = 0; i < n - 1; i++)
            tmp[i + 1] = tmp[i] + sufCmp (sa[i], sa[i + 1]);
        for (int i = 0; i < n; i++)
            poz[sa[i]] = tmp[i];
        if (tmp[n - 1] == n - 1)
            break;
    }
}

int lcp[nmax];

void buildLcp ()
{
    for (int i = 0, k = 0; i < n; i++)
    {
        if (poz[i] == n - 1)
            continue;
        for (int j = sa[poz[i] + 1]; s[i + k] == s[j + k];)
            k++;
        lcp[poz[i]] = k;
        if (k)
            k--;
    }
}

signed main ()
{
    fin >> n >> k;
    fin >> s;

    buildSuffixArray ();
    buildLcp ();

    deque <int> dq;
    int w = k - 1;
    int rez = 0;

    for (int i = 0; i < n - 1; i++)
    {
        while (!dq.empty () && lcp[dq.back ()] >= lcp[i])
            dq.pop_back ();
        dq.push_back (i);

        while (!dq.empty () && dq.front () <= i - w)
            dq.pop_front ();

        if (i >= w - 1)
            rez = max (rez, lcp[dq.front ()]);
    }

    fout << rez;
    return 0;
}