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 <vector>
using namespace std;

int main(){
    string S;
    int K, N;
    cin >> N >> K;
    cin >> S;

    int A[10^5];//0の始まりの位置を順番に覚える
    int B[10^5]; //1の始まりの位置を順番に覚える

    int i, j, k;
    j=0; //A[j-1]まで埋まっている
    k=0; //A[k-1]まで埋まっている
    char count; //i-1番目が0なのか1なのか

    count=S.at(0);

    if(S.at(0)=='0'){
        A[0]=0; j=1;
    }
    else{
        B[0]=0; k=1;
    }

    for(i=1; i<N; i++){
        if(S.at(i)!=count){
            if(count=='0'){
                B[k]=i; k++;
                count='1';
            }
            else{
                A[j]=i; j++;
                count='0';
            }
        }
    }

    int C[10^5]; // 1の終わりの位置を順番に覚える
    
    for(i=0; i<k; i++){
        C[i]=A[i+1]-1;
    }

    int ans;
    ans=0;

    if (k <= K){
        ans = N;
    }
/*   else{
        ans = A[K];
        for(i=0; i+K<k-1; i++){
            ans = max (ans, A[i+K]-B[i]);
        }
    }
 */   
    else{
        ans = A[K];
            for(i=0; i<k-K-1; i++){
                ans = max (ans, C[i+K]-B[i]+1);
            }
    }
  
    cout << ans <<endl;
  //  cout << A[0] << A[1] << B[0] << B[1] <<endl;


}