Cod sursa(job #2343468)

Utilizator radugnnGone Radu Mihnea radugnn Data 13 februarie 2019 23:53:26
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <algorithm>
#define DIM 17000
#define ff first.first
#define fs first.second
#define poz second
using namespace std;
ifstream fin ("substr.in");
ofstream fout("substr.out");
int n,k,i,exp,sol,lng,mat[16][DIM],v[DIM];
pair< pair<int, int>, int > L[DIM];
char e[DIM];

int lcp(int i, int j) {
    int k, sol=0, x;
    if (i == j)
        return n - i;
    for (k=exp; k>=0 && i<n && j<n; --k)
        if (mat[k][i] == mat[k][j]){
            x=(1<<k);
            i+= x;
            j+= x;
            sol+= x;
        }
    return sol;
}

int main() {

    fin>>n>>k;
    if (k==1) {
        fout<<n;
        return 0;
    }
    fin>>e;

    for (i=0;i<n;i++)
        mat[0][i]=(e[i]-'0');

    for (exp=0,lng=1;  lng<=n;  exp++,lng*=2) {
        for (i=0;i<n;i++) {
            L[i].ff=mat[exp][i];
            if (i+lng<n)
                L[i].fs=mat[exp][i+lng];
            else
                L[i].fs='$';
            L[i].poz = i;
        }
        sort(L, L+n);

        mat[exp+1][L[0].poz]=0;
        for (i=1;i<n;i++)
            if (L[i].ff == L[i-1].ff  &&  L[i].fs == L[i-1].fs)
                mat[exp+1][L[i].poz]=mat[exp+1][L[i-1].poz];
            else
                mat[exp+1][L[i].poz]=mat[exp+1][L[i-1].poz]+1;
    }

    for (i=0;i<n;i++) {
        v[mat[exp][i]]=i;
    }

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

    }

    fout<<sol;

    return 0;
}