Pagini recente » Cod sursa (job #1344472) | Cod sursa (job #2262760) | Cod sursa (job #2754216) | Cod sursa (job #83044) | Cod sursa (job #1150946)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define NMAX 17000
int N ,K , P[17][NMAX] , best , k;
char s[NMAX] ;
struct lista
{
int nr[2] , p;
}L[NMAX];
bool f(lista A , lista B)
{
if(A.nr[0] == B.nr[0])return A.nr[1] < B.nr[1] ;
return A.nr[0] < B.nr[0] ;
}
int prefix(char A[] , char B[] , int x , int y)
{
int ls = 0 , ld = k , mid , rez = 0;
while(ls <= ld)
{
mid = (ls+ld)/2;
if(P[mid][x] == P[mid][y])
{
rez = 1<<mid;
ls = mid+1;
}
else ld = mid-1;
}
int n = strlen(A);
int m = strlen(B);
while(rez <= n && rez <= m && A[rez] == B[rez])rez++;
return rez;
}
int main()
{
freopen("substr.in" , "r" , stdin );
freopen("substr.out" , "w" , stdout );
scanf("%d%d\n" , &N , &K );
scanf("%s" , s+1);
for(int i = 1 ; i <= N ; ++i )
P[0][i] = s[i]-'0';
int l;
for(k = 1 , l = 1 ; 1<<k <= N ; ++k , l <<=1 )
{
for(int i = 1 ; i <= N ; ++i )
{
L[i].nr[0] = P[k-1][i];
if(i+l <= N)L[i].nr[1] = P[k-1][i+l];
else L[i].nr[1] = -1;
L[i].p = i;
}
sort(L+1,L+N+1,f);
for(int i = 1 ; i<= N ; ++i )
if(i > 1 && L[i].nr[0] == L[i-1].nr[0] && L[i].nr[1] == L[i-1].nr[1])
P[k][L[i].p] = P[k][L[i-1].p];
else P[k][L[i].p] = i;
}
k--;
for(int i = 1; i <= N-K+1 ; ++i )
best = max(best , prefix(s+L[i].p , s+L[i+K-1].p , L[i].p,L[i+K-1].p));
printf("%d" , best);
return 0;
}