const arr = readline().split(" ");
const inputStr = readline();
const n = parseInt(arr[0]);
const m = parseInt(arr[1]);
//将a|b所在坐标记录为a,b两个数组,此处我为了自己看着方便是以1开始的
let arrA = [],arrB = [];
let resultLen = 0;
for(let i = 0;i < inputStr.length;i++){
if(inputStr[i] == "a"){
arrA.push(i + 1);
}else{
arrB.push(i + 1);
}
}
const lenA = arrA.length,lenB = arrB.length;
if(lenA <= m || lenB <= m){//a或b的数目小与等于操作次数,肯定是总长度了
resultLen = n;
}
// a,b 都超过 m 时,如果将a 换成 b,从第i个a 开始换,那么 长度为 arrA[i-1] 到 arrA[i + m]的差值 -1
// 边界情况 m + 1 = arrA.length,最长的话就是n - arrA[0] 或者 arrA[m] - 1
let resultA = getResult(n,m,arrA),resultB = getResult(n,m,arrB);
resultA > resultB ? print(resultA) : print(resultB);
function getResult(n,m,arr){
if(m + 1 == arr.length){
return n - arr[0] > arr[m] - 1 ? n - arr[0] : arr[m] - 1;
}
let result = 0;
for(let i = 1;i <= arr.length - m;i++){
//比较一下每次的值省的以后再去比对,其实可以增加一个参数arrB,直接来计算更新result,但是刚开始为了写完,没注意这些,应该会更节约一些吧
result = arr[i + m] - arr[i - 1] - 1 > result ? arr[i + m] - arr[i - 1] - 1 : result;
}
return result;
}