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 JavaScript (node.js v5.12) (judge verdict: Wrong Answer)

"use strict";
    
const main = arg => {
    arg = arg.trim().split("\n");
    const N = parseInt(arg[0].split(" ")[0]);
    const K = parseInt(arg[0].split(" ")[1]);
    
    const S = arg[1].split("");
    
    // 奇数番目に連続する1の数、偶数版目に連続する0の数 の配列を用意
    let list = [];
    
    if(S.indexOf("0") === -1) {
        console.log(N);
        return;
    }
    
    if(S.indexOf("1") === -1) {
        console.log(N);
        return;
    }
    
    if(S[0] !== "1") {
        list.push("0");
    }
    
    let streak = 0;
    
    for(let i=1; i<N; i++) {
        if(S[i] === S[i - 1]) {
            streak++;
        } else {
            streak++;
            list.push(String(streak));
            streak = 0;
        }
    }
    
    streak++;
    list.push(streak);

    
    if(S[S.length - 1] !== "1") {
        list.push(String(0));
    }
    
    // 集計
    let answer = 0;
    
    
    if(K + K > list.length) {
        
        answer = list.reduce((m,n)=>parseInt(m)+parseInt(n))
    
    } else {
        
        // 累積和
        let cumulativeSum = [list[0]];
        
        for(let i=1; i<list.length; i++) {
            cumulativeSum[i] = list[i-1] + list[i];
        }
        
        for(let left=0; left<list.length - (K + K); left += 2) {
            let sum = 0;
            let right = left + K + K;
            
            // console.log("left:"  + left);
            // console.log("right:" + right);
            
            for(let i=left; i<=right; i++) {
                sum += list[i]
            }
            
            // console.log("sum:" + sum)
            answer = Math.max(sum, answer);
        }
        
    }

    
    
    console.log(answer);
}
main(require('fs').readFileSync('/dev/stdin', 'utf8'));