Cod sursa(job #2346299)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 17 februarie 2019 15:18:03
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#define v1 first.first
#define v2 first.second
#define poz second

using namespace std;

const int DIM=16400;
char s[DIM];
int n;
int p[18][DIM],val[DIM];
int e,len;
pair< pair<int, int>, int > L[DIM];

int lcp(int i, int j) {
    int f = e;
    int len = (1<<e);
    int sol = 0;
    while (len) {
        if (p[f][i] == p[f][j]) {
            sol += len;
            i+=len;
            j+=len;
        }

        f--;
        len/=2;

    }
    return sol;

}

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

    int k;
    fin>>n>>k;

    fin>>s;
    //n = strlen(s);

    for (int i=0;i<n;i++)
        p[0][i] = s[i]-'a';

    for (e=0, len=1;len<=n;e++, len*=2) {
        /// am sortat dupa len = 2^e
        /// caut sa sortez dupa 2*len = 2^(e+1)

        for (int i=0;i<n;i++) {
            L[i].v1 = p[e][i];
            if (i+len < n)
                L[i].v2 = p[e][i+len];
            else
                L[i].v2 = -1;
            L[i].poz = i;
        }
        sort(L, L+n);
        p[ e+1 ][ L[0].poz ] = 0;
        for (int i=1;i<n;i++)
            if (L[i].first == L[i-1].first)
                p[ e+1 ][ L[i].poz ] = p[ e+1 ][ L[i-1].poz ];
            else
                p[ e+1 ][ L[i].poz ] = 1 + p[ e+1 ][ L[i-1].poz ];
    }

    /// linia e este rezultal final

    for(int i=0;i<n;i++)
    //fout<<p[e][i]<<' ';
        val[p[e][i]]=i;

    int sol=0;

    for(int i=0;(i+k-1)<n;i++)
        sol=max(sol,lcp(val[i],val[i+k-1]));

    fout<<sol<<'\n';

  //  int sol=0,step=(1<<21);
    return 0;
}