Pagini recente » Cod sursa (job #321526) | Cod sursa (job #2989270) | Cod sursa (job #983154) | Cod sursa (job #2113624) | Cod sursa (job #2385431)
#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;
}