#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
struct elem{
int nr[2],p;
} L[20000];
int N,K,P[17][20000],stp,cnt; char s[60000];
bool cmp(const elem A, const elem B){
if (A.nr[0]==B.nr[0]) return A.nr[1]<B.nr[1];
return A.nr[0]<B.nr[0];
}
void build_arr(){
int i;
for (i=1; i<=N; i++) P[0][i]=s[i]-'a';
for (stp=1, cnt=1; (cnt>>1) <=N; stp++,cnt<<=1){
for (i=1; i<=N; i++){
L[i].nr[0]=P[stp-1][i];
L[i].nr[1]=i+cnt<=N ? P[stp-1][i+cnt] : -1;
L[i].p=i;
}
sort(L+1,L+N+1,cmp);
for (i=1; i<=N; i++)
P[stp][L[i].p]= i>1 && L[i].nr[0]==L[i-1].nr[0] && L[i].nr[1]==L[i-1].nr[1] ? P[stp][L[i-1].p] : i;
}
}
int lcp(int x, int y){
int i,res=0;
for (i=stp-1; i>=0 && x<=N && y<=N; i--){
if (P[i][x]==P[i][y])
res+=(1<<i),x+=(1<<i),y+=(1<<i);
}
return res;
}
int main(){
ifstream fin("substr.in");
ofstream fout("substr.out");
fin >> N >> K;
int i;
for (i=1; i<=N; i++)
fin >> s[i];
build_arr();
int res=0;
for (i=1; i<=N-K+1; i++)
res=max(res,lcp(L[i].p,L[i+K-1].p));
fout << res << "\n";
return 0;
}