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>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

#define off ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define pi 3.141592653589793116
#define mod 1e9+7
typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;
int main() {
  off;
  
  int t;
  //cin>>t;
  t=1;
  while(t--){  
    string s;int n,k;
    cin>>n>>k>>s;
    vector <int> v,l,r;
    int pre=0,z=0;
    if(s[0]=='0')
        l.push_back(0);
    for(int i=0;i<n;i++)
        {
           if(s[i]=='1')
              {
                ++pre;
                if(z!=0)
                    {
                       v.push_back(z);
                       z=0;
                    }
              }
           else
              {  ++z;
                  if(pre!=0)
                    {
                        l.push_back(pre);
                        pre=0;
                    }
              }   
        }
      //cout<<pre<<" "<<z<<"\n";
      if(z!=0)
        {
            v.push_back(z);
        }  
     int ans=l[0];
     for(int i=1;i<l.size();i++)
        {  ans=max(l[i],ans);
           r.push_back(l[i]);
        }
       ans=max(ans,pre); 
      r.push_back(pre);
       
      priority_queue < pair<int,int> > q;
      for(int i=0;i<v.size();i++)
          {
             q.push({v[i]+l[i]+r[i],i});
          }
       //cout<<v.size()<<'\n';      
       if(q.size()==0)
           {
              cout<<n;
              return 0;
           }  
       int vis[v.size()];
       memset(vis,0,sizeof(vis));   
      while(k>0 && q.size()>0)
          {   --k;
              ans=max(ans,q.top().first);
              int b=q.top().second;
              q.pop();
              if(vis[b]==1)
                 continue;
              vis[b]=1; 
              if(b>0)
                 {
                    r[b-1]=ans;
                    q.push({r[b-1]+v[b-1]+l[b-1],b-1});
                 }
              if(b<v.size()-1)
                 {
                    l[b+1]=ans;
                    q.push({r[b+1]+v[b+1]+l[b+1],b+1});
                 }   
          }
       cout<<ans<<'\n';   
               
  }
    return 0;
}