Cod sursa(job #2641691)

Utilizator AlexandruabcdeDobleaga Alexandru Alexandruabcde Data 12 august 2020 13:29:01
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

constexpr int NMAX = 16390;

int N, K;

char sir[ NMAX ];

int lg[ NMAX ];
int order[ NMAX ];

int Suffix[20][NMAX];
pair <pair <int, int>, int> Key[NMAX];

void Suffix_Array () {
    lg[1] = 0;
    for (int i = 2; i <= N; ++ i ) {
        lg[ i ] = lg[ i / 2 ] + 1;
    }
    for (int i = 1; i <= N; ++ i ) {
        Suffix[0][i] = sir[i] - '0' + 1;
    }

    for (int i = 1; i <= lg[ N ] + 2; ++ i ) {
        for (int j = 1; j <= N; ++ j ) {
            Key[ j ] = {{Suffix[i-1][j], (j + (1<<(i-1)) <= N ? Suffix[i-1][j+(1<<(i-1))] : 0)}, j};
        }

        sort(Key + 1, Key + N + 1);
        int cnt = 0;

        for (int j = 1; j <= N; ++ j ) {
            if (Key[j].first != Key[j-1].first) {
                ++ cnt;
            }

            Suffix[i][Key[j].second] = cnt;
        }
    }
}

int LCP (int i, int j) {
    int ans = 0, M = N - max(i, j) + 1;

    for (int p = lg[M]; p >= 0 && i <= N && j <= N; -- p ) {
        if (Suffix[p][i] == Suffix[p][j]) {
            ans += (1<<p);
            i += (1<<p);
            j += (1<<p);
        }
    }

    return ans;
}
int main()
{
    f >> N >> K;

    if (K == 1) {
        g << N << '\n';
        return 0;
    }

    for (int i = 1; i <= N; ++ i ) {
        f >> sir[ i ];
    }

    Suffix_Array();

    for (int i = 1; i <= N; ++ i ) {
        order[Suffix[lg[N]+2][i]] = i;
    }

    int sol = 0;
    for (int i = 1; i <= N; ++ i ) {
        sol = max(sol, LCP(order[i], order[i+K-1]));
    }

    g << sol << '\n';
    return 0;
}