Cod sursa(job #1583559)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 29 ianuarie 2016 01:12:33
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
/*
    Solutia cu multiset nu ia 100 :(
*/

#include <cstdio>
#include <algorithm>

const int EXP = 1 << 5;
const int DIM = 1 << 17;
using namespace std;

int N, K, maxim, stp, cnt, P[EXP][DIM]; char S[DIM];
struct suffix { int left, right, value; } L[DIM];

bool CMP( suffix X, suffix Y ) {
    if( X.left == Y.left )
        return X.right < Y.right;
    return X.left < Y.left;
}

int LCP( int X, int Y ) {
    int answer = 0;

    if( X == Y )
        return N - X;

    for( int i = stp - 1; i >= 0 && X < N && Y < N; i --) {
        if( P[i][X] == P[i][Y] ) {
            answer += 1 << i;
            X += 1 << i; Y += 1 << i;
        }
    }

    return answer;
}

int main () {

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

    scanf( "%d %d %s", &N, &K, S );

    for( int i = 0; i < N; i ++ )
        P[0][i] = S[i] - 'a';

    for( stp = 1, cnt = 1; cnt < N << 1; stp ++, cnt <<= 1 ) {
        for( int i = 0; i < N; i ++ ) {
            L[i].left  = P[stp - 1][i];
            L[i].right = (i + cnt < N) ? P[stp - 1][i + cnt] : -1; // o valoare < 0
            L[i].value = i;
        }

        sort( L, L + N, CMP );

        for( int i = 0; i < N; i ++ ) {
            if( i && L[i].left == L[i - 1].left && L[i].right == L[i - 1].right )
                P[stp][L[i].value] = P[stp][L[i - 1].value];
            else
                P[stp][L[i].value] = i;
        }
    }

    for( int i = 0; i < N - K + 1; i ++ )
        maxim = max( maxim, LCP( L[i].value, L[i + K - 1].value ));

    printf( "%d\n", maxim );

    return 0;
}