#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define ll long long
#define pii std::pair<int,int>
#define pli std::pair<ll,int>
#define pil std::pair<int,ll>
#define psi std::pair<string,int>
#define pll std::pair<ll,ll>
#define pci std::pair<char,int>
#define sll(x) scanf("%lld",&x)
#define prll(x) printf("%lld ",x)
#define pri(x) printf("%d ",x)
#define si(x) scanf("%d",&x)
#define pb push_back
#define vll std::vector<ll>
#define vpi std::vector<std::pair<int,int>>
#define vi std::vector<int>
#define vvi std::vector<std::vector<int>>
#define vvpil std::vector<std::vector<std::pair<int,ll>>>
#define vlpii std::vector<std::list<pii>>
#define vlpil std::vector<std::list<pil>>
#define li std::list<int>
#define lpil std::list<pil>
#define Endl printf("\n")
#define vli vector<list<int>>
#define vvll vector<vector<ll>>
#define mp make_pair
#define x first
#define y second
#define ull uint64_t
#define ma 100000000
#define imie(...) "[" << #__VA_ARGS__": " << (__VA_ARGS__) << "] "
const ll  INF=10000000000000;
const ll mod =  1e9 + 7;
using namespace std;
void computeLPSArray(string pat, int M, int* lps); 
void add(ll& a , ll b){
	a += b;
	if(a >= mod) a -= mod;
}
ll mul(ll a , ll b){
	return (a * b) % mod;
}
ll Pow(ll a , ll b){
	if(b == 0) return 1 ;
	ll c = Pow(a , b / 2) ;
	if(b % 2) return (a * ((c * c)% mod )) % mod ;
	return (c * c) % mod ;
}
vector<int> KMPSearch(string pat, string txt) 
{ 
	int M = pat.length(); 
	int N = txt.length(); 
	vector<int> ans ;
	// create lps[] that will hold the longest prefix suffix 
	// values for pattern 
	int lps[M]; 

	// Preprocess the pattern (calculate lps[] array) 
	computeLPSArray(pat, M, lps); 

	int i = 0; // index for txt[] 
	int j = 0; // index for pat[] 
	while (i < N) { 
		if (pat[j] == txt[i]) { 
			j++; 
			i++; 
		} 

		if (j == M) { 
			ans.push_back(i - j) ;
			j = lps[j - 1]; 
		} 

		// mismatch after j matches 
		else if (i < N && pat[j] != txt[i]) { 
			// Do not match lps[0..lps[j-1]] characters, 
			// they will match anyway 
			if (j != 0) 
				j = lps[j - 1]; 
			else
				i = i + 1; 
		} 
	} 
	return ans ;
} 

// Fills lps[] for given patttern pat[0..M-1] 
void computeLPSArray(string pat, int M, int* lps) 
{ 
	// length of the previous longest prefix suffix 
	int len = 0; 

	lps[0] = 0; // lps[0] is always 0 

	// the loop calculates lps[i] for i = 1 to M-1 
	int i = 1; 
	while (i < M) { 
		if (pat[i] == pat[len]) { 
			len++; 
			lps[i] = len; 
			i++; 
		} 
		else // (pat[i] != pat[len]) 
		{ 
			// This is tricky. Consider the example. 
			// AAACAAAA and i = 7. The idea is similar 
			// to search step. 
			if (len != 0) { 
				len = lps[len - 1]; 

				// Also, note that we do not increment 
				// i here 
			} 
			else // if (len == 0) 
			{ 
				lps[i] = 0; 
				i++; 
			} 
		} 
	} 
} 
//check modulo
int main(){
	IOS;
	cout.precision(30) ;
	int n , k ; cin >> n >> k ;
	string s ; cin >> s ;
	vi a ;
	int nb = 1 ;
	for(int i = 1 ; i < n ; i++){
		if(s[i] == s[i - 1]) nb++ ;
		else{
			a.pb(nb) ;
			nb = 1 ;
		}
	}
	a.pb(nb) ;
	n = a.size() ;
	vll prefix(n) ;
	prefix[0] = a[0];
	for(int i = 1 ; i < n ; i++) prefix[i] = prefix[i - 1] + a[i] ;
	ll ans = 0 ;
	if(s[0] == '0'){
		for(int i = 0 ; i < n ; i++){
			if(i % 2){
				if(i <= 2 * k) ans = max(ans , prefix[i]) ;
				else ans = max(ans , prefix[i] - prefix[i - (2 * k + 1)]) ;
			}
			else{
				if(i <= 2 * k - 2) ans = max(ans , prefix[i]) ;
				else ans = max(ans , prefix[i] - prefix[i - 2 * k]) ;
			}
		}
		cout << ans << endl ;
		return 0 ;
	}
	for(int i = 0 ; i < n ; i++){
			if(i % 2 == 0){
				if(i <= 2 * k) ans = max(ans , prefix[i]) ;
				else ans = max(ans , prefix[i] - prefix[i - (2 * k + 1)]) ;
			}
			else{
				if(i <= 2 * k - 2) ans = max(ans , prefix[i]) ;
				else ans = max(ans , prefix[i] - prefix[i - (2 * k)]) ;
			}
	}
	cout << ans << endl ;
	
	return 0;
}


Measured memory_bytes: 1656