#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std;
vector<pair<char,int> >I;
vector<pair<int,int> >F;
vector<pair<pair<int,int>,int> >Q;
int n,k,L[20][20010],cnt,j,i,a,b,lg,SOL,compara(int,int);
char S[20010];
int main()
{
freopen("substr.in","r",stdin);
freopen("substr.out","w",stdout);
scanf("%d%d",&n,&k);
scanf(" %s",S);
for(i=0;i<n;i++)
I.push_back(make_pair(S[i],i));
sort(I.begin(),I.end());
vector<pair<char,int> >::iterator it=I.begin();
L[0][it->second]=cnt=1;
for(vector<pair<char,int> >::iterator jt=I.begin()+1;jt!=I.end();jt++,it++)
{
if(jt->first!=it->first)cnt++;
L[0][jt->second]=cnt;
}
for(i=2,lg=1;i<=n+n;i<<=1,lg++)
{
Q.resize(0);
for(j=0;j<n;j++)
{
a=L[lg-1][j];
if((j+(i>>1))>=n)b=0; else b=L[lg-1][j+(i>>1)];
Q.push_back(make_pair(make_pair(a,b),j));
}
sort(Q.begin(),Q.end());
vector<pair<pair<int,int>,int> >::iterator lt=Q.begin();
lt=Q.begin();
L[lg][lt->second]=cnt=1;
for(vector<pair<pair<int,int>,int> >::iterator rt=Q.begin()+1;rt!=Q.end();rt++,lt++)
{
if((*lt).first.first!=(*rt).first.first || (*lt).first.second != (*rt).first.second)cnt++;
L[lg][rt->second]=cnt;
}
}
lg--;
for(j=0;j<n;j++)F.push_back(make_pair(L[lg][j],j));
sort(F.begin(),F.end());
vector<pair<int,int> >::iterator aul=F.begin();
vector<pair<int,int> >::iterator aur=F.begin()+k-1;
for(;aur<F.end();aul++,aur++)
SOL=max(SOL,compara(aul->second,aur->second));
printf("%d\n",SOL);
}
int compara(int X,int Y)
{
int res=0;
while(X<n && Y<n)
{
if(S[X]!=S[Y])break;
res++;
X++;Y++;
}
return res;
}