Cod sursa(job #1290665)

Utilizator xtreme77Patrick Sava xtreme77 Data 11 decembrie 2014 17:44:11
Problema Substr Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
/*
 * Code by Spiromanul
 */

#include <fstream>
#include <algorithm>

const char IN [ ] = "substr.in" ;
const char OUT [ ] = "substr.out" ;
const int MAX = 17000 ;

using namespace std;

ifstream fin ( IN ) ;
ofstream fout ( OUT ) ;

char sir [ MAX ] ;

int mat [ 4 * MAX ] [ 20 ] , lung , pas , T [ MAX ] , n ;

bool cmp ( int a , int b )
{
    if ( mat [ a ] [ pas ] == mat [ b ] [ pas ] )
        return mat [ a + lung ] [ pas ] < mat [ b + lung ] [ pas ] ;
    return mat [ a ] [ pas ] < mat [ b ] [ pas ] ;
}

void siruri_de_sufixe ( )
{
    int i , j ;
    for ( i = 1 ; i <= n ; ++ i )
    {
        mat [ i ] [ 0 ] = sir [ i ] ;
        T [ i ] = i ;
    }
    for ( pas = 0 ; ( 1 << pas ) <= n ; ++ pas )
    {
        lung = 1 << pas ;

        sort ( T + 1 , T + n + 1 , cmp ) ;

        for ( i = 1 ; i <= n ; i = j )
            for ( j = i ; j <= n ; ++ j )
                if ( mat [ T [ i ] ] [ pas ] == mat [ T [ j ] ] [ pas ] and mat [ T [ i ] + lung ] [ pas ] == mat [ T [ j ] + lung ] [ pas ] )
                    mat [ T [ j ] ] [ pas + 1 ] = i ;
                else break ;
    }
}

int lcp ( int x , int y )
{
    int SOL = 0 ;

    if ( x == y )
        return n - x + 1 ;

    for ( int step = pas ; step >= 0 and x <= n and y <= n ; -- step  )
        if ( mat [ x ] [ step ] == mat [ y ] [ step ] )
        {
            SOL = SOL + ( 1 << step ) ;
            x = x + ( 1 << step ) ;
            y = y + ( 1 << step ) ;
        }
    return SOL ;
}

int main(    )
{
    int k ;
    fin >> n >> k ;
    fin >> ( sir + 1 ) ;
    siruri_de_sufixe() ;
    int ce_trebuie = 0 ;
    for ( int i = 1 ; i <= n ; ++ i )
        ce_trebuie = max ( ce_trebuie , lcp ( T [ i ] , T [ i + k - 1 ] ) ) ;
    fout << ce_trebuie ;
    return 0;
}