Cod sursa(job #2873189)

Utilizator alex_braslasuBraslasu Alexandru alex_braslasu Data 18 martie 2022 20:40:53
Problema Substr Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <algorithm>
#include <fstream>

#define N_MAX 17000

using namespace std;

ifstream f("substr.in");
ofstream g("substr.out");

int n, i, j, k, cnt, maxi, p[N_MAX][17], lg[N_MAX], sa[N_MAX];
char s[N_MAX];

struct pct
{
    int a, b, ind;
    bool operator<(const pct &B) const{
        if (a != B.a)
            return a < B.a;
        return b < B.b;
    }
} v[N_MAX];

static inline int lcp(int x, int y)
{
    if (x == y)
        return n - x + 1;
    int sol = 0;
    for (j = lg[n]; j >= 0; --j)
        if (p[x][j] == p[y][j])
            sol += (1 << j), x += (1 << j), y += (1 << j);
    return sol;
}

int main()
{
    ios::sync_with_stdio(false);
    f.tie(nullptr);
    f >> n >> k;
    f >> (s + 1);
    for (i = 1; i <= n; ++i)
        p[i][0] = int(s[i]);
    for (i = 2; i <= n; ++i)
        lg[i] = lg[i >> 1] + 1;
    if ((1 << lg[n]) < lg[n])
        ++lg[n];
    for (j = 1; j <= lg[n]; ++j)
    {
        for (i = 1; i <= n; ++i)
        {
            v[i].a = p[i][j - 1];
            v[i].b = p[i + (1 << (j - 1))][j - 1];
            v[i].ind = i;
        }
        sort(v + 1, v + n + 1);
        cnt = 0;
        p[v[1].ind][j] = ++cnt;
        for (i = 2; i <= n; ++i)
            if (v[i - 1].a != v[i].a || v[i - 1].b != v[i].b)
                p[v[i].ind][j] = ++cnt;
            else
                p[v[i].ind][j] = cnt;
    }
    for (i = 1; i <= n; ++i)
        sa[p[i][lg[n]]] = i;
    for (i = 1; i <= n - k + 1; ++i)
        maxi = max(maxi, lcp(sa[i], sa[i + k - 1]));
    g << maxi;
    return 0;
}