Cod sursa(job #2400646)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 8 aprilie 2019 23:07:08
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <fstream>
#include <algorithm>
#define DIM 17000
using namespace std;

ifstream fin ("substr.in");
ofstream fout ("substr.out");
struct idk{
    int x,y,poz;
};
idk v[DIM];
int w[DIM],suf[17][DIM];
char s[DIM];
int n,k,i,j,ex,sol,lg;
bool cmp (idk a, idk b){
    if (a.x == b.x){
        if (a.y == b.y)
            return a.poz < b.poz;
        return a.y < b.y;
    }
    return a.x < b.x;
}
int lcp (int i, int j){
    /// cel mai lung prefix comun care incepe pe i si pe j
    int val = ex;
    int sol = 0;
    while (val >= 0){
        if (suf[val][i] == suf[val][j]){
            sol += (1<<val);
            i += (1<<val);
            j += (1<<val);
        }

        val--;
    }
    return sol;
}
int main (){

    fin>>n>>k>>s;
    if (k == 1){
        fout<<n;
        return 0;
    }
    for (i=0;i<n;i++)
        suf[0][i] = s[i] - '0';
    /// suf[ex][i] - pozitia sirului i....i+2^k-1 in sirul sortat
    /// mentin sufixele sortate dupa prefixe de lg 2^k
    for (lg=1;lg<=n;lg*=2,ex++){

        for (i=0;i<n;i++){
            v[i].x = suf[ex][i];
            v[i].y = (i+lg < n) ? (suf[ex][i+lg]) : (-1);
            v[i].poz = i;
        }
        sort (v,v+n,cmp);

        for (i=1;i<n;i++){
            if (v[i].x == v[i-1].x && v[i].y == v[i-1].y)
                suf[ex+1][v[i].poz] = suf[ex+1][v[i-1].poz];
            else suf[ex+1][v[i].poz] = 1+suf[ex+1][v[i-1].poz];
        }

    }

    for (i=0;i<n;i++)
        w[suf[ex][i]] = i;

    /*for (i=0;i<=ex;i++){
        for (j=0;j<n;j++)
            fout<<suf[i][j]<<" ";
        fout<<"\n";
    }*/

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

    return 0;
}