Cod sursa(job #2401563)

Utilizator popabogdanPopa Bogdan Ioan popabogdan Data 9 aprilie 2019 20:06:01
Problema Substr Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>

#define Nmax 16390

using namespace std;

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

int N, K;
int suff[15][Nmax];
char C[Nmax];
pair < pair <int, int>, int> P[Nmax];
int LCP[Nmax];
int sortedSuffixes[Nmax];

int getLCP(int a, int b)
{
    int ret = 0;
    for(int i = 14; i >= 0; i--)
        if(suff[i][a] == suff[i][b])
        {
            ret += (1 << i);
            a += (1 << i);
            b += (1 << i);
        }
    return ret;
}

int main()
{
    fin >> N >> K;
    fin >> (C + 1);
    for(int i = 1; i <= N; i++)
        suff[0][i] = C[i];
    for(int k = 1; k <= 14; k++)
    {
        for(int i = 1; i <= N; i++)
            P[i] = make_pair(make_pair(suff[k - 1][i], (i + (1 << (k - 1)) <= N ? suff[k - 1][i + (1 << (k - 1))] : 0)), i);
        sort(P + 1, P + N + 1);
        int L = 1;
        suff[k][P[1].second] = 1;
        for(int i = 2; i <= N; i++)
            if(P[i].first != P[L].first)
            {
                P[++L] = P[i];
                suff[k][P[i].second] = L;
            }
    }
    for(int i = 1; i <= N; i++)
        sortedSuffixes[suff[14][i]] = i;
    int ans = 0;
    if(K == 1)
        ans = N;
    else
    for(int i = 1; i + K - 1 <= N; i++)
        ans = max(ans, getLCP(sortedSuffixes[i], sortedSuffixes[i + K - 1]));
    fout << ans << "\n";
    return 0;
}