program DTKSUB;
const maxN=trunc(5e4)+10;
base1=2147483648;
base=2147483647;
var n,k,ans: longint;
pow,hash,a: array[0..maxN] of longint;
s: ansistring;
procedure sort(l,h: longint);
var i,j,x,tm: longint;
begin
i:=l;
j:=h;
x:=a[random(h-l+1)+l];
repeat
while a[i]<x do inc(i);
while a[j]>x do dec(j);
if i<=j then
begin
tm:=a[i];
a[i]:=a[j];
a[j]:=tm;
inc(i); dec(j);
end;
until i>j;
if i<h then sort(i,h);
if j>l then sort(l,j);
end;
function get(i,j: longint): longint ;
begin
exit( (hash[j]-int64(hash[i-1])*pow[j-i+1]+ base1*base1) and base );
end;
function kt(n: longint): boolean;
var i,j: longint;
begin
i:=1;
while i<=n-k+1 do
begin
j:=i;
while (a[j]=a[j+1]) and (j<n) do inc(j);
if j-i+1>=k then exit(true);
i:=j+1;
end;
exit(false);
end;
procedure main;
var i,l,r,m: longint;
begin
readln(n,k);
readln(s);
pow[0]:=1;
for i:=1 to n do pow[i]:=(int64(pow[i-1])* 26) and base;
for i:=1 to n do hash[i]:=(int64(hash[i-1])*26+ord(s[i])-97) and base;
l:=1; r:=n-k+1;
while l<=r do
begin
m:=(l+r) shr 1;
for i:=1 to n-m+1 do
a[i]:=get(i,i+m-1);
sort(1,n-m+1);
if kt(n-m+1) then
begin
ans:=m;
l:=m+1;
end
else r:=m-1;
end;
write(ans);
end;
BEGIN
main;
END.
cHJvZ3JhbSBEVEtTVUI7CmNvbnN0ICAgbWF4Tj10cnVuYyg1ZTQpKzEwOwogICAgICAgIGJhc2UxPTIxNDc0ODM2NDg7CiAgICAgICAgYmFzZT0yMTQ3NDgzNjQ3Owp2YXIgICAgIG4sayxhbnM6IGxvbmdpbnQ7CiAgICAgICAgcG93LGhhc2gsYTogYXJyYXlbMC4ubWF4Tl0gb2YgbG9uZ2ludDsKICAgICAgICBzOiBhbnNpc3RyaW5nOwpwcm9jZWR1cmUgc29ydChsLGg6IGxvbmdpbnQpOwogdmFyICAgIGksaix4LHRtOiBsb25naW50OwogYmVnaW4KICAgICAgICBpOj1sOwogICAgICAgIGo6PWg7CiAgICAgICAgeDo9YVtyYW5kb20oaC1sKzEpK2xdOwogICAgICAgIHJlcGVhdAogICAgICAgICAgICAgICAgd2hpbGUgYVtpXTx4IGRvIGluYyhpKTsKICAgICAgICAgICAgICAgIHdoaWxlIGFbal0+eCBkbyBkZWMoaik7CiAgICAgICAgICAgICAgICBpZiBpPD1qIHRoZW4KICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICAgICB0bTo9YVtpXTsKICAgICAgICAgICAgICAgICAgICAgICAgYVtpXTo9YVtqXTsKICAgICAgICAgICAgICAgICAgICAgICAgYVtqXTo9dG07CiAgICAgICAgICAgICAgICAgICAgICAgIGluYyhpKTsgZGVjKGopOwogICAgICAgICAgICAgICAgIGVuZDsKICAgICAgICB1bnRpbCBpPmo7CiAgICAgICAgaWYgaTxoIHRoZW4gc29ydChpLGgpOwogICAgICAgIGlmIGo+bCB0aGVuIHNvcnQobCxqKTsKIGVuZDsKZnVuY3Rpb24gZ2V0KGksajogbG9uZ2ludCk6IGxvbmdpbnQgOwogYmVnaW4KICAgICAgICBleGl0KCAoaGFzaFtqXS1pbnQ2NChoYXNoW2ktMV0pKnBvd1tqLWkrMV0rIGJhc2UxKmJhc2UxKSBhbmQgYmFzZSApOwogZW5kOwpmdW5jdGlvbiBrdChuOiBsb25naW50KTogYm9vbGVhbjsKIHZhciAgICBpLGo6IGxvbmdpbnQ7CiBiZWdpbgogICAgICAgIGk6PTE7CiAgICAgICAgd2hpbGUgaTw9bi1rKzEgZG8KICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgIGo6PWk7CiAgICAgICAgICAgICAgICB3aGlsZSAoYVtqXT1hW2orMV0pIGFuZCAoajxuKSBkbyBpbmMoaik7CiAgICAgICAgICAgICAgICBpZiBqLWkrMT49ayB0aGVuIGV4aXQodHJ1ZSk7CiAgICAgICAgICAgICAgICBpOj1qKzE7CiAgICAgICAgIGVuZDsKICAgICAgICBleGl0KGZhbHNlKTsKIGVuZDsKcHJvY2VkdXJlIG1haW47CiB2YXIgICAgaSxsLHIsbTogbG9uZ2ludDsKIGJlZ2luCiAgICAgICAgcmVhZGxuKG4sayk7CiAgICAgICAgcmVhZGxuKHMpOwogICAgICAgIHBvd1swXTo9MTsKICAgICAgICBmb3IgaTo9MSB0byBuIGRvIHBvd1tpXTo9KGludDY0KHBvd1tpLTFdKSogMjYpIGFuZCBiYXNlOwogICAgICAgIGZvciBpOj0xIHRvIG4gZG8gaGFzaFtpXTo9KGludDY0KGhhc2hbaS0xXSkqMjYrb3JkKHNbaV0pLTk3KSBhbmQgYmFzZTsKICAgICAgICBsOj0xOyByOj1uLWsrMTsKICAgICAgICB3aGlsZSBsPD1yIGRvCiAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICBtOj0obCtyKSBzaHIgMTsKICAgICAgICAgICAgICAgIGZvciBpOj0xIHRvIG4tbSsxIGRvCiAgICAgICAgICAgICAgICAgICAgICAgIGFbaV06PWdldChpLGkrbS0xKTsKICAgICAgICAgICAgICAgIHNvcnQoMSxuLW0rMSk7CiAgICAgICAgICAgICAgICBpZiBrdChuLW0rMSkgdGhlbgogICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgICAgICAgIGFuczo9bTsKICAgICAgICAgICAgICAgICAgICAgICAgbDo9bSsxOwogICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgZWxzZSAgICByOj1tLTE7CiAgICAgICAgIGVuZDsKICAgICAgICB3cml0ZShhbnMpOwogZW5kOwpCRUdJTgogICAgICAgIG1haW47CkVORC4=