Pagini recente » Cod sursa (job #2789663) | Cod sursa (job #712713) | Cod sursa (job #2337626) | Cod sursa (job #2722994) | Cod sursa (job #1150965)
#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(int x , int y)
{
int rez = 0;
for(int i = k , l = (1<<k) ; i >=0 && x <= N && y<= N ;i--, l>>=1)
if(P[i][x] == P[i][y] && x+l -1 <= N && y+l-1 <= N )
{
x = x+l;
y = y+l;
rez +=l;
}
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 ; l>>1 <= 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(L[i].p,L[i+K-1].p));
printf("%d" , best);
return 0;
}