Cod sursa(job #2338738)

Utilizator mariusn01Marius Nicoli mariusn01 Data 7 februarie 2019 19:18:11
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>
#include <cstring>
#include <algorithm>
#define v1 first.first
#define v2 first.second
#define poz second
#define DIM 16400
using namespace std;

pair< pair<int, int>, int > L[DIM];
int P[17][DIM];
char s[DIM];
int e, n, k, i, len;
int v[DIM];

int lcp(int i, int j) {
    int putere = (1<<e);
    int f = e;
    int sol = 0;
    while (putere) {
        if (P[f][i] == P[f][j]) {
            i+=putere;
            j+=putere;
            sol+=putere;
        }
        f--;
        putere /= 2;
    }
    return sol;
}

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

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

    for (i=0;i<n;i++)
        P[0][i] = s[i];

    for (e=0, len=1;len<=n;e++,len*=2) {
        /// calculez linia e+1 din matricea P, adica, avand in P
        /// pozitiile din sirul sortat dupa secvente de lungime len,
        /// voi calcula pozitiile din sirul sortat considerand secvente de lungime
        /// 2*len, si voi memora aceste informatii pe linia e+1

        for (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 (i=1;i<n;i++)
            if (L[i].v1 == L[i-1].v1 && L[i].v2 == L[i-1].v2)
                P[e+1][ L[i].poz ] = P[e+1][ L[i-1].poz ];
            else
                P[e+1][ L[i].poz ] = P[e+1][ L[i-1].poz ] + 1;
    }

    for (i=0;i<n;i++)
        v[  P[e][i]  ] = i;

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

    return 0;
}