Pagini recente » Cod sursa (job #2947211) | Cod sursa (job #1206563) | Cod sursa (job #2138263) | Cod sursa (job #2418948) | Cod sursa (job #1583554)
/*
Solutia cu multiset nu ia 100 :(
*/
#include <cstdio>
#include <algorithm>
const int EXP = 1 << 4;
const int DIM = 1 << 16;
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 + 1;
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 = 1; i <= N - K + 1; i ++ )
maxim = max( maxim, LCP( L[i].value, L[i + K - 1].value ));
printf( "%d\n", maxim );
return 0;
}