#include <fstream>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
long N,K;
char S[18000];
long Best;
long vec[63] = {0,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'0','1','2','3','4','5','6','7','8','9'};
long pp[256];
void Make(void)
{
for (long i = 0;i < 63;i += 1)
{
pp[vec[i]] = i;
}
}
void Rezolva(vector<long> &V,long L)
{
vector<long> *W = new vector<long>[63];
long i;
for (i = 0;i < 63;i += 1)
{
W[i].reserve(V.size());
}
for (i = 0;i < V.size();i += 1)
{
W[pp[S[V[i] + L]]].push_back(V[i]);
}
if (W[0].size() >= K)
{
if (L > Best)
{
Best = L;
}
}
for (i = 1;i < 63;i += 1)
{
if (W[i].size() >= K)
{
if ((L + 1) > Best)
{
Best = L + 1;
}
Rezolva(W[i],L + 1);
}
}
delete[] W;
}
int main(void)
{
Make();
fstream fin("substr.in",ios::in);
fstream fout("substr.out",ios::out);
long i;
vector<long> W;
fin >> N >> K >> S;
W.reserve(N);
for (i = 0;i < N;i += 1)
{
W.push_back(i);
}
Rezolva(W,0);
fout << Best;
fin.close();
fout.close();
return 0;
}