#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,n) for(ll i=0;i<n;i++)
#define repl(i,l,r) for(ll i=(l);i<(r);i++)
#define per(i,n) for(ll i=n-1;i>=0;i--)
#define perl(i,r,l) for(ll i=r-1;i>=l;i--)
#define fi first
#define se second
#define pb push_back
#define ins insert
#define all(x) (x).begin(),(x).end()
using vl=vector<ll>;
using vvl=vector<vector<ll>>;
const ll MOD=1000000007;
const ll MOD9=998244353;
const int inf=1e9+10;
const ll INF=4e18;
const ll dy[8]={1,0,-1,0,1,1,-1,-1};
const ll dx[8]={0,-1,0,1,1,-1,1,-1};
using Graph = vector<vector<int>>;
const double pi=acos(-1);
template<int MOD> struct Fp {
    long long val;
    constexpr Fp(long long v = 0) noexcept : val(v % MOD) {
        if (val < 0) val += MOD;
    }
    constexpr int getmod() { return MOD; }
    constexpr Fp operator - () const noexcept {
        return val ? MOD - val : 0;
    }
    constexpr Fp operator + (const Fp& r) const noexcept { return Fp(*this) += r; }
    constexpr Fp operator - (const Fp& r) const noexcept { return Fp(*this) -= r; }
    constexpr Fp operator * (const Fp& r) const noexcept { return Fp(*this) *= r; }
    constexpr Fp operator / (const Fp& r) const noexcept { return Fp(*this) /= r; }
    constexpr Fp& operator += (const Fp& r) noexcept {
        val += r.val;
        if (val >= MOD) val -= MOD;
        return *this;
    }
    constexpr Fp& operator -= (const Fp& r) noexcept {
        val -= r.val;
        if (val < 0) val += MOD;
        return *this;
    }
    constexpr Fp& operator *= (const Fp& r) noexcept {
        val = val * r.val % MOD;
        return *this;
    }
    constexpr Fp& operator /= (const Fp& r) noexcept {
        long long a = r.val, b = MOD, u = 1, v = 0;
        while (b) {
            long long t = a / b;
            a -= t * b; swap(a, b);
            u -= t * v; swap(u, v);
        }
        val = val * u % MOD;
        if (val < 0) val += MOD;
        return *this;
    }
    constexpr bool operator == (const Fp& r) const noexcept {
        return this->val == r.val;
    }
    constexpr bool operator != (const Fp& r) const noexcept {
        return this->val != r.val;
    }
    friend constexpr ostream& operator << (ostream &os, const Fp<MOD>& x) noexcept {
        return os << x.val;
    }
    friend constexpr Fp<MOD> modpow(const Fp<MOD> &a, long long n) noexcept {
        if (n == 0) return 1;
        auto t = modpow(a, n / 2);
        t = t * t;
        if (n & 1) t = t * a;
        return t;
    }
};
using mint = Fp<MOD>;

mint calc(long long N, long long K) {
    mint res = 1;
    for (long long n = 0; n < K; ++n) {
        res *= (N - n);
        res /= (n + 1);
    }
    return res;
}
int main() {
//cout << fixed << setprecision(12);
ll n,k;
cin>>n>>k;
string s;
cin>>s;
ll a[n]={};
ll b[n]={};
ll aa=0;
ll bb=0;
ll ca=0;
ll cb=0;
ll cc=0;
ll cd=0;
rep(i,n){
if(s.at(i)=='1'){
while(i+ca<n&&s.at(i+ca)=='1'){
ca++;}
i+=ca-1;
a[aa]=ca;
ca=0;
aa++;}
else{
while(i+cb<n&&s.at(i+cb)=='0'){
cb++;}
i+=cb-1;
b[bb]=cb;
cb=0;
bb++;}}
ca=0;
if(k>=bb){
cout << n << endl;}
else{
//cout << aa << " " << bb << endl;
if(s.at(0)=='0'){
rep(i,k){
ca+=(a[i]+b[i]);}
//cout << ca << endl;
cc=ca;
if(aa>k){
ca=max(ca,ca-b[0]+a[k]+b[k]);
//cout << ca << endl;
}
else goto asd;
cc=cc-b[0]+a[k]+b[k];
//cout << cc;
//cout << cc << endl;
repl(i,k+1,aa){
cc=cc-a[i-k-1]-b[i-k]+a[i]+b[i];
//cout << cc << endl;
ca=max(ca,cc);}
//cout << ca << endl;
}
asd:
if(s.at(0)=='1'){
rep(i,k){
ca+=a[i]+b[i];}
ca+=a[k];
cc=ca;
repl(i,k+1,aa){
cc=cc-a[i-k-1]-b[i-k-1]+a[i]+b[i-1];
ca=max(ca,cc);
//cout << ca << endl;
}}
//cout << ca << endl;
if(s.at(n-1)==s.at(0)){
if(s.at(n-1)=='0'){
rep(i,k){
cb+=(a[bb-2-i]+b[bb-1-i]);}
if(bb-k-2>=0){
cb=max(cb,cb-b[bb-1]+a[bb-2-k]+b[bb-1-k]);}}
else{
rep(i,k){
cb+=(a[aa-1-i]+b[aa-1-i]);}}}
if(s.at(n-1)!=s.at(0)){
rep(i,k){
cb+=(a[aa-1-i]+b[aa-1-i]);}
if(s.at(n-1)=='0'){
cb=max(cb,cb-b[aa-1]+a[aa-1-k]+b[aa-1-k]);}}
ca=max(ca,cb);
cout << ca << endl;
}}


Measured memory_bytes: 5336