Cod sursa(job #2339825)

Utilizator Leonard123Mirt Leonard Leonard123 Data 9 februarie 2019 13:10:30
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include <fstream>
#include <algorithm>
#include <cstring>
#define DIM 16400
#define v1 first.first
#define v2 first.second
#define poz second

using namespace std;

char s[DIM];
int a[17][DIM];
int v[DIM];
pair< pair<int, int>, int > L[DIM];
int i, n, e, len, k, sol;
ifstream fin ("substr.in");
ofstream fout("substr.out");

int lcp(int i, int j) {
    int putere = (1 << e);
    int f = e;

    int sol = 0;
    while (putere != 0) {
        if (a[f][i] == a[f][j]) {
            i+=putere;
            j+=putere;
            sol+=putere;
        }
        putere /= 2;
        f--;
    }
    return sol;
}


int main () {
    fin>>n>>k;
    fin>>s;
///    n = strlen(s);
/**
    a[i][j] = pozitia in surul de sufixe sortat
            a sufixului care incepe la pozitia j si tinand cont doar de primele 2^i caractere
            ale fiecarui sufix
**/
    /// a[0][ceva] este doar in fuctie de s[ceva]
    for (i=0;i<n;i++)
        a[0][i] = s[i]-'a';

    /// len = 2^e
    for (e=0, len = 1;len <= n; e++, len*=2) {
        /// am pe linia e in a ordinea dupa prefice de lungime len
        /// si voi cacula pe linia e+1 ordinea dupa prefixe de lungime len*2
        for (i=0;i<n;i++) {
            L[i].v1 = a[e][i];
            if (i+len < n)
                L[i].v2 = a[e][i+len];
            else
                L[i].v2 = -1;
            L[i].poz = i;
        }
        sort(L, L+n);

        a[e+1][ L[0].poz ] = 0;
        for (i=1;i<n;i++)
            if ( L[i].v1 == L[i-1].v1 && L[i].v2 == L[i-1].v2 )
                a[e+1][ L[i].poz ] = a[e+1][ L[i-1].poz ];
            else
                a[e+1][ L[i].poz ] = a[e+1][ L[i-1].poz ]+1;
    }

    for (i=0;i<n;i++) {
        v[ a[e][i] ] = i;
    }


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

    fout<<sol;
    return 0;
}