Cod sursa(job #2343504)

Utilizator TheSeekerRobert Cristian Dobra TheSeeker Data 14 februarie 2019 06:32:22
Problema Substr Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <algoritm>
#define DIM 16400
#define v1 first.first
#define v2 first.second
#define poz second
using namespace std;

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

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

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;
    if (k==1){
        fout<<n;
        return 0;
    }
    fin>>s;
    for (i=0;i<n;i++)
        p[0][i]=s[i]-'0';
    for (e=0, len=1;len<=n;e++, len*=2){
        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;
    }
    for (i=0;i+k-1<n;i++)
        sol=max(sol,lcp(v[i],v[i+k-1]))
    fout<<sol;
    return 0;
}