Cod sursa(job #2343248)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 13 februarie 2019 20:30:20
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <algorithm>
#define x first.first
#define y first.second
#define poz second
#define dim 16400

using namespace std;

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

int n,k,i,e,len,sol;
char s;

pair <pair<int,int>,int> l[dim];
int p[17][dim],v[dim];

int lcp(int i, int j){
    int f=e;
    int P=(1<<e);
    int sol=0;

    while(P){
        if(p[f][i]==p[f][j]){
            sol+=P;
            i+=P;
            j+=P;
        }

        f--;
        P/=2;
    }

    return sol;
}

int main(){
    fin>>n>>k;
    for(i=0;i<n;i++){
        fin>>s;
        p[0][i]=s-'0';
    }

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

    for(e=0,len=1;len<=n;e++,len*=2){
        for(i=0;i<n;i++){
            l[i].x=p[e][i];
            if(i+len<n)
                l[i].y=p[e][i+len];
            else
                l[i].y=-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].first == l[i-1].first)
                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;
}