Cod sursa(job #2385417)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 21 martie 2019 21:38:46
Problema Substr Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 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) <= 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;
}