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 <bits/stdc++.h>
using namespace std;
#define ll          long long int
#define pb          push_back
#define pll         pair<ll,ll>
#define speed_up    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define mode        998244353
#define mod         1000000007
#define inf         1000000000000000000LL
#define vl          vector<ll>
#define F           first
#define S           second
#define db          long double
#define sz(x)       (ll)x.size()
#define fix(n)      cout<<fixed<<setprecision(n)
#define rep(i,a,b)  for(ll i=a;i<b;i++)
#define all(x)      x.begin(),x.end()
#define mset(x)     memset(x,0,sizeof x)
#define pi          3.14159265358979323

const int N = 1e5+5;

string s;
ll k, n;
ll zp[N];
set<ll>ind;

bool ok(ll x, ll y)
{
       if(zp[y]-zp[x]<=k) return true;
       else return false;
}

void solve()
{
       cin>>n>>k>>s;
       if(s[0]=='1') ind.insert(1);
       rep(i,1,n)
       {
              if(s[i-1]=='0' && s[i] == '1') ind.insert(i+1);
       }
       zp[0]=0;
       for(ll i=0; i<n; i++)
       {
              zp[i+1] = zp[i];
              if(i==0 && s[0]=='0') zp[i+1]=1;
              else
              {
                     if((i!=0 && s[i-1]=='1' && s[i]=='0'))
                            zp[i+1]++;
              }
       }
       /*for(ll z : ind) cout<<z<<" ";
       cout<<endl;
       rep(i,1,n+1) cout<<zp[i]<<" ";*/
       ll mx = 0;
       ll fsp;
       for(ll x : ind) { fsp = x; break; }
       if(k>0) mx = fsp;
       for(ll i=1; i<=n; i++)
       {
              if(ind.find(i)==ind.end()) continue;
              ll l=i, r=n;
              while(r-l>1)
              {
                     ll mid = (r+l)/2;
                     if(ok(i, mid)) l=mid;
                     else r=mid;
              }
              if(ok(i, r)) mx=max(mx, r-i+1);
              else if(ok(i, l)) mx=max(mx, l-i+1);
       }
       cout<<mx;
}


int main() {
	ll T = 1;
	speed_up
	//cin>>T;
	while(T--)
	    solve();
	return 0;
}