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;

#define ll long long
#define INF 99999999
#define rep(i,n) for(int i=0,temp=(int)(n);i<temp;++i) //vec.size()がnの時等の高速化
#define loop(i,start,end) for(int i=start,temp=(int)(end);i<end;++i)
#define rfor(v,x) for(const auto& x : v) //xは値を表す
#define all(x) (x).begin(),(x).end()
#define SORT(v, n) sort(v, v+n)
#define vsort(v) sort(v.begin(), v.end())
#define vfsort(v,lambda) sort(v.begin(),v.end(),lambda)
#define vint vector<int>
#define vvint vector<vector<int>>
#define vin(v) rep(i,v.size()) {cin >> v[i];}

template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int ctoi(char c) {return c-'0';}
//(lambda (x y) (< x y)) => [](int x, int y) -> int { return x<y; }


int main(){
  int n,k;
  vint bit;
  cin >> n >> k;
  string s;cin >> s;

  if(s[0]=='0') k=k*2;
  else k=k*2+1;
  
  int plus=0,minus=0;
  rep(i,n){
    if(s[i]=='1') {
      plus++;
      if(minus!=0){ 
        bit.push_back(minus);
        minus=0;
      }
    }
    else {
      minus++;
      if(plus!=0){ 
        bit.push_back(plus);
        plus=0;
      }
    }
  }
  if(plus!=0) bit.push_back(plus);
  if(minus!=0) bit.push_back(minus);

  //debug
  //rep(i,bit.size())
  //  cout << bit[i];
  //cout << endl;

  vint sigma(bit.size()+1);
  sigma[0]=0;
  rep(i,sigma.size()+1)
    sigma[i+1]=sigma[i]+bit[i];
  
  //debug
  //rep(i,sigma.size())
  //  cout << sigma[i];
  //cout << endl;

  int ans=0;
  
  rep(i,sigma.size()-k+1){
    chmax(ans,sigma[k+i]-sigma[i]);
  }

  cout << ans << endl;

  vint().swap(bit);
  vint().swap(sigma);

}