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 <stack>
#include <queue>
#include <cstdio>
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define Rep(i,n0,n) for(int i=n0;i<n;i++)
#define Com(i,j,n) for(int i=0;i<n-1;i++)for(int j=i+1;j<n;j++)
const int INF =100100100;
const int MOD = (int)1e9+7;
const double EPS = 1e-9;
typedef long long ll;
typedef long li;
#define pb push_back 
#define mp make_pair

signed main (){	
	string hoge;
	int NN,KK ;
	cin >> NN >> KK ;
	cin >> hoge;
	vector <int> renzokuchi;
	char temp;
	temp = hoge[0];
	int counter = 1;
	Rep(i,1,NN){
		if(temp == hoge[i]) {
			counter ++;
		} else {
			temp = hoge[i];
			renzokuchi.pb(counter);
			if(i == NN - 1){
				renzokuchi.pb(1);
				counter = 0;
				break;
			}
			counter = 1;
		}
	}
	if(counter != 0 ) {
		renzokuchi.pb(counter);
	}

	int max = 0;
	int current_value = 0;
	int blocks = renzokuchi.size();

	int start,end;
	// 直立はじまりのとき
	if(hoge[0] == '0') {

		// 全部行けるとき
		if ((blocks + blocks%2)/2 <= KK) {
			rep(i,blocks){
				max += renzokuchi[i];
			}
			cout << max << endl;
			return 0;
		}

		start = 0;
		end = 2 * KK - 1;

		rep(i,end + 1) {	// 最初の長さを取る
				current_value += renzokuchi[i];
		}
		max = current_value;

		while(end < blocks) {
			// blocksの先頭を取って、しゃくとりをする
			if(start = 0) {
				current_value -= renzokuchi[start];
				if (end+1 < blocks) {
					current_value += renzokuchi[end+1];
					if(end+2 < blocks){
						current_value += renzokuchi[end+2];
					}
				}
			}
			else {
				current_value -= renzokuchi[start];
				current_value -= renzokuchi[start+1];
				
				if (end+1 < blocks) {
					current_value += renzokuchi[end+1];
					if(end+2 < blocks){
						current_value += renzokuchi[end+2];
					}
				}
			}

			if( max < current_value) {max = current_value;}
			start += 2;
			end +=2;
		}

	} 
	else { // 倒立始まり
		// 全部行けるとき
		if ((blocks - blocks%2)/2 <= KK) {
			rep(i,blocks){
				max += renzokuchi[i];
			}
			cout << max << endl;
			return 0;
		}

		start = 0;
		end = 2 * KK + 1;

		rep(i, end + 1) {
				current_value += renzokuchi[i];
		}
		max = current_value;

		while(end < blocks) {	// 最初の長さを取る
			// blocksの先頭を取って、しゃくとりをする
			current_value -= renzokuchi[start];
			current_value -= renzokuchi[start-1];
			if (end+1 < blocks) {
				current_value += renzokuchi[end+1];
				if(end+2 < blocks){
					current_value += renzokuchi[end+2];
				}
			}
			if( max < current_value) max = current_value;
			start += 2;
			end +=2;
		}
	}
	cout << max << endl;


	return 0;
}