Pagini recente » Cod sursa (job #318831) | Cod sursa (job #997216) | Cod sursa (job #1343915) | Cod sursa (job #2346147) | Cod sursa (job #1290665)
/*
* 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;
}