#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const char iname[]="substr.in";
const char oname[]="substr.out";
const int maxn=18000;
const int maxl=16;
char s[maxn];
int sa[maxn],pref[maxl][maxn],i,j,n,k,maxt;
template<class T1,class T2,class T3> struct mpair
{
T1 first;
T2 second;
T3 third;
mpair() : first(T1()), second(T2()), third(T3()) {}
mpair(const T1& x, const T2& y,const T3& z) : first(x), second(y), third(z) {}
};
template<class F1,class F2,class F3>
inline mpair<F1,F2,F3>
make_mpair(F1 x,F2 y,F3 z)
{
return (mpair<F1,F2,F3>(x,y,z) );
}
mpair<int,int,int> L[maxn];
int lcp(int x,int y)
{
int k,rez=0;
if(x==y)
return n-x;
for(k=i-1;k>=0&&x<n&&y<n;--k)
if(pref[k][x]==pref[k][y])
x+=(1<<k),y+=(1<<k),rez+=(1<<k);
return rez;
}
bool fcomp(mpair<int,int,int> a,mpair<int,int,int> b)
{
if(a.first!=b.first)
return a.first<b.first;
return a.second<b.second;
}
int main()
{
freopen(iname,"r",stdin);
freopen(oname,"w",stdout);
scanf("%d%d\n",&n,&k);
fgets(s,sizeof(s),stdin);
for(i=0;i<n;++i)
pref[0][i]=s[i]-'0';
for(i=1;(1<<i-2)<=n;++i)
{
for(j=0;j<n;++j)
{
L[j].first=pref[i-1][j];
L[j].second=j+(1<<i-1)<n?pref[i-1][j+(1<<i-1)]:-1;
L[j].third=j;
}
sort(L,L+n,fcomp);
for(j=0;j<n;++j)
pref[i][L[j].third]=(j>0&&L[j].first==L[j-1].first&&L[j].second==L[j-1].second?pref[i][L[j-1].third]:j);
}
for(j=n-k;j>=0;--j)
maxt=max(maxt,lcp(L[j].third,L[j+k-1].third));
printf("%d\n",maxt);
fclose(stdin);
fclose(stdout);
return 0;
}