Cod sursa(job #2401555)

Utilizator popabogdanPopa Bogdan Ioan popabogdan Data 9 aprilie 2019 19:58:18
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 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 <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(suff[k - 1][i], (i + (1 << (k - 1)) <= N ? suff[k - 1][i + (1 << (k - 1))] : 0));
        sort(P + 1, P + N + 1);
        int L = 1;
        for(int i = 2; i <= N; i++)
            if(P[i] != P[L])
                P[++L] = P[i];
        for(int i = 1; i <= N; i++)
        {
            pair <int, int> q = make_pair(suff[k - 1][i], (i + (1 << (k - 1)) <= N ? suff[k - 1][i + (1 << (k - 1))] : 0));
            suff[k][i] = lower_bound(P + 1, P + L + 1, q) - P;
        }
    }
    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;
}