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)

// https://atcoder.jp/contests/abc124/tasks/abc124_d

#include <algorithm>
#include <cmath>
#include <deque>
#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <tuple>
#include <vector>
using namespace std;

typedef long long ll;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
#define ALL(obj) (obj).begin(), (obj).end()
#define ALLR(obj) (obj).rbegin(), (obj).rend()

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, k;
    ll ans = 0;
    string s;
    cin >> n >> k;
    cin >> s;

    // 0, 1が連続する数を保存
    vector<int> v0, v1;
    int a0 = 0, a1 = 0;
    // 先頭が０なら、１が０個として扱う
    if (s[0] == '0') {
        v1.push_back(0);
    }
    for (auto x : s) {
        if (x == '0') {
            if (a1 > 0) {
                v1.push_back(a1);
                a1 = 0;
            }
            a0++;
        } else {
            if (a0 > 0) {
                v0.push_back(a0);
                a0 = 0;
            }
            a1++;
        }
    }

    if (a0 > 0) {
        v0.push_back(a0);
    }
    if (a1 > 0) {
        v1.push_back(a1);
    }
    // 末尾が０なら、１が０個として扱う
    if (s[s.length() - 1] == '0') {
        v1.push_back(0);
    }

    ll tmp = 0;
    for (int i = 0; i < k; i++) {
        tmp += v0[i] + v1[i];
    }
    tmp += v1[k];
    ans = max(ans, tmp);

    for (int i = k; i < v1.size() - 1; i++) {
        tmp -= v0[i - k];
        tmp -= v1[i - k];
        tmp += v0[i];
        tmp += v1[i + 1];
        ans = max(ans, tmp);
    }

    cout << ans << endl;

    return 0;
}