#include <algorithm>
#include <fstream>
#include <cstring>
using namespace std;
const int N=17000, LG=16;
ifstream fin("substr.in");
ofstream fout("substr.out");
struct entry{
int nr1, nr2, poz;
bool operator<(const entry &e) const
{
if(nr1==e.nr1) return nr2<e.nr2;
return nr1<e.nr1;
}
bool operator!=(const entry &e) const
{
return (nr1!=e.nr1||nr2!=e.nr2);
}
} L[N];
char a[N];
int P[LG][N], poz[N];
int n, step;
void Sa_build(char a[], const int n)
{
int i, k;
for(i=0;i<n;i++) P[0][i]=a[i]-'a';
for(step=1, k=1;(k>>1)<n;step++, k<<=1)
{
for(i=0;i<n;i++)
{
L[i].nr1=P[step-1][i];
L[i].nr2=i+k<n?P[step-1][i+k]:-1;
L[i].poz=i;
}
sort(L, L+n);
for(i=0;i<n;i++)
{
if(!i||L[i]!=L[i-1]) P[step][L[i].poz]=i;
else P[step][L[i].poz]=P[step][L[i-1].poz];
}
}
step--;
for(i=0;i<n;i++) poz[P[step][i]]=i;
}
int lcp(int x, int y)
{
if(x==y) return n-x;
int k, ret=0;
for(k=step;k>=0&&x<n&&y<n;k--)
{
if(P[k][x]==P[k][y])
{
x+=(1<<k);
y+=(1<<k);
ret+=(1<<k);
}
}
return ret;
}
int main()
{
int k, i, sol=0;
fin>>n>>k>>a;
Sa_build(a, n);
for(i=0;i+k<=n;i++) sol=max(sol, lcp(poz[i], poz[i+k-1]));
fout<<sol<<"\n";
fin.close();
fout.close();
}