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: Wrong Answer)

#include<iostream>
#include<map>
#include<vector>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm> 
#include<climits>
#include<queue>
using namespace std;
 
#define REP(i,n) for (int i=0;i<(n);++i)
#define rep(i,a,b) for(int i=a;i<(b);++i)
# define p(s) std::cout << s ;
# define pl(s)  std::cout << s << endl;
# define printIf(j,s1,s2) cout << (j ? s1 : s2) << endl;
# define YES(j) cout << (j ? "YES" : "NO") << endl;
# define Yes(j) std::cout << (j ? "Yes" : "No") << endl;
# define showVector(v) REP(i,v.size()){p(v[i]);p(" ")} pl("")
template<class T> inline bool chmin(T &a, T b){ if(a > b) { a = b; return true;} return false;}
template<class T> inline bool chmax(T &a, T b){ if(a < b) { a = b; return true;} return false;}
typedef pair<int,int> P_ii;
typedef long long int ll;
const int mod = 1e9+7;
 
 
int main()
{
	int n,k;cin >> n >> k ;
	string s;cin >> s;
 
	vector<int> count_v;
 
	char s1=s[0];
	int c=1;
	count_v.push_back(0);
	rep(i,1,n) {
		if(s1==s[i]) c++;
		else {
			count_v.push_back(c);
			s1=s[i];
			c=1;
		}
	}
	count_v.push_back(c);
	count_v.push_back(0);
	REP(i,count_v.size()-1) count_v[i+1] += count_v[i];

	if(n==1){
		pl(1)
		return 0;
	}

	long long ans = 0;
	if(2*k>=count_v.size()) REP(i,count_v.size()) ans += count_v[i];
    else {
		long long int start_i=0;
		rep(i,1,count_v.size()-1) {
			long long int tmp = 0;
			if(s[start_i]=='0'){
				if(i+2*k  <=count_v.size()-1) tmp = count_v[i+2*k-1] - count_v[i-1];
			} else {
				if(i+2*k+1<=count_v.size()-1) tmp = count_v[i+2*k] - count_v[i-1];
			}
			//cout << start_i << ":" << s[start_i] << ":" << i+2*k+1 << ":" << tmp << endl;
			start_i = count_v[i];
			chmax(ans,tmp);
		}
	}
	pl(ans)
}