// #pragma GCC optimize("O3,unroll-loops,fast-math")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define fi first
#define se second
using namespace std;
const int Nmax=16384+5,inf=1e9,MOD=1e9+7;
int n,k;
string s;
int sa[Nmax],rk[Nmax],temp[Nmax],lcp[Nmax];
int lg;
bool cmp(int a, int b) {
if (rk[a]!=rk[b]) return rk[a]<rk[b];
int ra=(a+lg<n ? rk[a+lg]:-1);
int rb=(b+lg<n ? rk[b+lg]:-1);
return ra<rb;
}
void build_sa() {
for (int i=0; i<n; ++i) {
sa[i]=i;
rk[i]=s[i];
}
lg=1;
while (1) {
sort(sa,sa+n,cmp);
temp[sa[0]]=0;
for (int i=1; i<n; ++i) temp[sa[i]]=temp[sa[i-1]]+cmp(sa[i-1],sa[i]);
memcpy(rk,temp,n*sizeof(int));
if (rk[sa[n-1]]==n-1) break;
lg<<=1;
}
}
void build_lcp() {
int curr=0;
for (int i=0; i<n; ++i) {
if (rk[i]==0) continue;
int j=sa[rk[i]-1];
while (i+curr<n && j+curr<n && s[i+curr]==s[j+curr]) curr++;
lcp[rk[i]]=curr;
if (curr) curr--;
}
}
int main() {
ifstream cin("substr.in");
ofstream cout("substr.out");
cin>>n>>k>>s;
n=s.size();
if (k==1) {
cout<<n;
return 0;
}
build_sa();
build_lcp();
int ans=0;
deque<int> dq;
for (int i=1; i<n; ++i) {
while (!dq.empty() && lcp[dq.back()]>=lcp[i]) dq.pop_back();
dq.push_back(i);
if (dq.front()<=i-k+1) dq.pop_front();
if (i>=k-1) ans=max(ans,lcp[dq.front()]);
}
cout<<ans;
return 0;
}