Pagini recente » Cod sursa (job #736902) | Cod sursa (job #880448) | Cod sursa (job #2834650) | Cod sursa (job #1133098) | Cod sursa (job #1150924)
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define NMAX 17000
int N ,K , P[17][NMAX] , best;
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 rez = 0;
while(rez < strlen(A) && rez < strlen(B) && 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';
for(int 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;
}
for(int i = 1; i <= N-K+1 ; ++i )
best = max(best , prefix(s+L[i].p,s+L[i+K-1].p));
printf("%d" , best);
return 0;
}