Problem:
Score : 400 points

Problem Statement

N people are arranged in a row from left to right.

You are given a string S of length N consisting of 0 and 1, and a positive integer K.

The i-th person from the left is standing on feet if the i-th character of S is 0, and standing on hands if that character is 1.

You will give the following direction at most K times (possibly zero):

Direction: Choose integers l and r satisfying 1 \leq l \leq r \leq N, and flip the l-th, (l+1)-th, ..., and r-th persons. That is, for each i = l, l+1, ..., r, the i-th person from the left now stands on hands if he/she was standing on feet, and stands on feet if he/she was standing on hands.

Find the maximum possible number of consecutive people standing on hands after at most K directions.

Constraints

N is an integer satisfying 1 \leq N \leq 10^5.

K is an integer satisfying 1 \leq K \leq 10^5.

The length of the string S is N.

Each character of the string S is 0 or 1.

Input

Input is given from Standard Input in the following format:

N K
S

Output

Print the maximum possible number of consecutive people standing on hands after at most K directions.

Sample Input 1

5 1
00010

Sample Output 1

4

We can have four consecutive people standing on hands, which is the maximum result, by giving the following direction:

Give the direction with l = 1, r = 3, which flips the first, second and third persons from the left.

Sample Input 2

14 2
11101010110011

Sample Output 2

8

Sample Input 3

1 1
1

Sample Output 3

1

No directions are necessary.

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
typedef pair<P,ll> Pll;
typedef pair<P,P> PP;
#define rep(i,a,n) for(int i = a;i < n;i++)
#define LINF (ll)1e17
#define INF 1e9
#define MOD 1e9+7
#define sMOD 1e5
#define fs first
#define sc second

ll gcd(ll a,ll b){
	if(!b) return a;
	return gcd(b,a%b);
}


signed main(){
	
	ll n,k,memo = 0,ans = 0;
	string s;
	
	ll cnt[10001] = {},cnt_index = 0;
	ll cnt2[10001]= {},l = 0,r = 0;
	
	cin >> n >> k;
	cin >> s;
	
	cnt[cnt_index]++;
	
	rep(i,1,s.size()){
		if(s[i-1] != s[i]) cnt_index++;
		cnt[cnt_index]++;
	}
	
	
	
	cnt2[0] = cnt[0];
	
	rep(i,1,cnt_index+1){
		cnt2[i] = cnt2[i-1] + cnt[i];
		//cout << cnt2[i] << endl;
	}
	
	
	
	if(s[0] == '0'){
		ans = cnt2[min(cnt_index,2*k-1)];
		l = -1;
		r = min(cnt_index,2*k-1);
		
		ans = max(ans,cnt2[min(cnt_index,2*k+1)] - cnt2[0]);
		r = min(cnt_index,2*k+1);
		l = 0;
		
		while(1){
			if(r >= cnt_index) break;
			else if(r+1 == cnt_index){
				ans = max(ans,cnt2[r+1] - cnt[l+2]);
				break;
			}
			else{
				ans = max(ans,cnt2[r+2] - cnt2[l+2]);
				r += 2;
				l += 2;
			}
		}
	}
	else{
		ans = cnt2[min(cnt_index,2*k)];
		//cout << cnt[min(cnt_index,2*k)] << endl;
		l = -1;
		r = min(cnt_index,2*k);
		
		while(1){
			if(r >= cnt_index) break;
			else if(r+1 == cnt_index){
				//cout <<  cnt2[r+1] - cnt[l+2] << endl;
				ans = max(ans,cnt2[r+1] - cnt[l+2]);
				break;
			}
			else{
				//cout <<  cnt2[r+2] - cnt2[l+2] << endl;
				ans = max(ans,cnt2[r+2] - cnt2[l+2]);
				r += 2;
				l += 2;
			}
		}
	}
	
	if(s.size() == 1 && k >= 1) ans = 1;
	else if(cnt_index == 0) ans = (ll)s.size();
	
	cout << ans << endl;
	
	return 0;

}