Cod sursa(job #2404524)

Utilizator KemyKoTeo Virghi KemyKo Data 12 aprilie 2019 22:51:21
Problema Substr Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>

using namespace std;

const int LOGMAX = 16;
const int MAXLEN = 16390;

char crStr[MAXLEN] ;
int len , minRep , crLog ;

struct Sir{
    int val[2];
    int ord ;
};

int dpOrd[LOGMAX][MAXLEN], v [MAXLEN] ;

Sir allSir [MAXLEN];

bool cmp(Sir a , Sir b){
    if (a.val[ 0 ] == b.val[ 0 ]) {
        return a.val [ 1 ] < b.val[ 1 ];
    }
    return a.val [ 0 ] < b.val [ 0 ];
}

void preCalcDp(){
    for (int i = 1 ; i <= len ; i++)
        dpOrd [ 0 ][ i ] = crStr [ i ] - 'a';

    for (crLog = 1 ; (1<<(crLog-1)) <= len ; crLog++){
        for ( int i = 1 ; i <= len ; i++ ){
            allSir [i].ord = i;
            allSir [i].val[0] = dpOrd [crLog - 1] [i];

            if ( i + (1<<(crLog-1) ) <= len )
                allSir [i].val [1] = dpOrd [crLog - 1] [i + (1<<(crLog-1) )];
            else
                allSir [i].val [1] = -1;
        }

        sort (allSir + 1 , allSir + len + 1 , cmp);

        dpOrd [crLog] [allSir [1].ord] = 1;
        for (int i = 2 ; i <= len ; i++){
            dpOrd [crLog][allSir[i].ord] = dpOrd[crLog][allSir[i - 1].ord];

            if ( allSir[i].val[0] != allSir [i - 1].val[0] || allSir [i].val [1] != allSir [i - 1].val[1])
                 dpOrd [crLog][ allSir[i].ord]++;
        }
    }
    crLog --;

    for(int i = 1 ; i < len ; i++)
        v[dpOrd[crLog][i]] = i;

}

int LongestCPRefix (int x , int y){
    int sol = 0;

    if (x == y)
        return len;

    for (int i = crLog ; i >= 0 ; i--){
        if(dpOrd [ i ][ x ] == dpOrd [i][y]){
            sol += (1<<i);
            x += (1<<i);
            y += (1<<i);

            if (x > len || y > len)
                return sol;
        }
    }
    return sol;
}

int main()
{
    freopen("substr.in","r",stdin);
    freopen("substr.out","w",stdout);

    scanf("%d%d", &len , &minRep);
    cin >> (crStr + 1) ;

    preCalcDp();

    int sol = 0;

    for (int i = 1 ; i < len - minRep + 1 ; i++)
        sol = max(sol , LongestCPRefix(v[i] , v [i + minRep - 1]));

    printf("%d", sol);
    return 0;
}