Cod sursa(job #2347736)

Utilizator mirceaisherebina mircea mirceaishere Data 19 februarie 2019 06:07:43
Problema Substr Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>
#include <algorithm>
#define v1 first.first
#define v2 first.second
#define poz second
using namespace std;
ifstream fin("substr.in");
ofstream fout("substr.out");

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

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

int main() {
    fin>>n>>k;
    fin>>s;
    for (i=0;i<n;i++){
        p[0][i]=s[i]-'0';
    }
    e=0;
    for(len=1; len<=n; len*=2) {
        e++;
        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;
}