# include <bits/stdc++.h>
using namespace std;
# define fi cin
# define fo cout
# define db double
# define ll long long
# define pi 3.14159265359
# define rad(x) (x * pi / 180)
const int p_1[] = {1,-1};
const ll mod1 = 100000004987ll;
const ll mod2 = 100000003759ll;
const ll mod3 = 100000001659ll;
const ll mod4 = 100000000379ll;
template < class T > inline T sqr(T x) {return x*x;}
template < class T > inline T min(T a,T b,T c) {return min(a,min(b,c));}
template < class T > inline T min(T a,T b,T c,T d) {return min(min(a,b),min(b,c));}
template < class T > inline T max(T a,T b,T c) {return max(a,max(b,c));}
template < class T > inline T max(T a,T b,T c,T d) {return max(max(a,b),max(b,c));}
template < class T > inline T det(T a,T b,T c,T d) {return a * c - b * d;}
template < class T > inline T det(T s[3][3])
{
return - s[0][0] * det(s[1][1],s[1][2],s[2][1],s[2][2]) + s[0][1] * det(s[1][0],s[1][2],s[2][0],s[2][2]) - s[0][2] * det(s[1][0],s[1][1],s[2][0],s[2][1]);
}
template < class T1 , class T2 , class T3 > inline T3 pow(T1 a,T2 b,T3 mod) {T3 ans = 1;while (b){if (b&1) ans = (1LL * ans * a) % mod;a = (1LL * a * a) % mod;b >>= 1;}return ans;}
template < class T > T phi(T n){T cnt = n,p = n,ans = n;for (T i = 2;i*i <= p;++i)if (!(cnt%i)){ans /= i;ans *= (i-1);while (!(cnt%i)) cnt /= i;}if (cnt > 1) ans /= cnt,ans *= (cnt - 1);return ans;}
template < class T > T f(T a,T b) {return a < b ? 0 : a / b + f(a / b);}
template < class T > T gcd(T a,T b) {return __gcd(a,b);}
class Reader {
public:
Reader(const string& filename):
m_stream(filename),
m_pos(kBufferSize - 1),
m_buffer(new char[kBufferSize]) {
next();
}
Reader& operator>>(int& value) {
value = 0;
while (current() < '0' || current() > '9')
next();
while (current() >= '0' && current() <= '9') {
value = value * 10 + current() - '0';
next();
}
return *this;
}
private:
const int kBufferSize = 32768;
char current() {
return m_buffer[m_pos];
}
void next() {
if (!(++m_pos != kBufferSize)) {
m_stream.read(m_buffer.get(), kBufferSize);
m_pos = 0;
}
}
ifstream m_stream;
int m_pos;
unique_ptr<char[]> m_buffer;
};
struct mod
{
ll x;
int y,z,t;
};
bool operator < (mod a,mod b)
{
if (a.x != b.x) return a.x < b.x;
if (a.y != b.y) return a.y < b.y;
if (a.z != b.z) return a.z < b.z;
return a.t < b.t;
}
map < mod , int > v;
char s[65536];
int n,k;
bool ok(int len)
{
v.clear();
mod p,m;
for (int i = 1;i <= len;++i)
{
m.x = (m.x * 26ll + s[i] - 'a') % mod1;
m.y = (m.y * 26ll + s[i] - 'a') % mod2;
m.z = (m.z * 26ll + s[i] - 'a') % mod3;
m.t = (m.t * 26ll + s[i] - 'a') % mod4;
p.x = (p.x * 26ll) % mod1;
p.y = (p.y * 26ll) % mod2;
p.z = (p.z * 26ll) % mod3;
p.t = (p.t * 26ll) % mod4;
}
v[m] += 1;
for (int i = len+1;i <= n;++i)
{
m.x = (- 26ll * mod1 + 1ll * p.x * (s[i - len] - 'a'));
m.y = (- 26ll * mod2 + 1ll * p.y * (s[i - len] - 'a'));
m.z = (- 26ll * mod3 + 1ll * p.z * (s[i - len] - 'a'));
m.t = (- 26ll * mod4 + 1ll * p.z * (s[i - len] - 'a'));
m.x = (m.x * 26ll + s[i] - 'a') % mod1;
m.y = (m.y * 26ll + s[i] - 'a') % mod2;
m.z = (m.z * 26ll + s[i] - 'a') % mod3;
m.t = (m.t * 26ll + s[i] - 'a') % mod4;
v[m] += 1;
if (v[m] >= k) return 1;
}
return 0;
}
int main(void)
{
ifstream fi("substr.in");
ofstream fo("substr.out");
fi>>n>>k;
fi>>(s+1);
int ans = 0;
for (int i = 16384;i;i >>= 1)
if (ok(ans + i)) ans += i;
return fo << ans << '\n',0;
}