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: Accepted)

#include <bits/stdc++.h>

#define ll long long int
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define REP(i, n) for (int i = 0; i < n; ++i)
#define FOREACH(x, a) for (auto &(x) : (a))
#define ALL(a) (a).begin(), (a).end()
#define OUT(x) out << (x) << endl;
#define M0(x) memset(x, 0, sizeof(x))
#define MINF(x) memset(x, 0x3f, sizeof(x))
#define MMINUS(a) memset(a, 0xff, sizeof(a))
#define ten(n) ((int)1e##n)

const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const ll LINF = 1e18;
const double EPS = 1.0 / LINF;
const char ENDL = '\n'; // for JetBrains IDE only supports yen

template <class T>
inline bool chmin(T &a, T b)
{
    if (a > b)
    {
        a = b;
        return true;
    }
    return false;
}

template <class T>
inline bool chmax(T &a, T b)
{
    if (a < b)
    {
        a = b;
        return true;
    }
    return false;
}

int gcd(int a, int b) { return b ? gcd(b, a % b) : a; }
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }

using namespace std;

int N, K;
string S;

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

    int z_cnt = 0;
    bool z_init = false;

    vector<int> v;
    char pre = '2';
    int pos = -1;

    REP(i, N)
    {
        if (i == 0 && S[i] == '0')
            z_init = true;

        if (S[i] == '0')
            z_cnt++;

        if (pre != S[i])
        {
            v.push_back(1);
            pre = S[i];
            pos++;
        }
        else
        {
            v[pos]++;
        }
    }

    int rev = min(K, z_cnt);

    ll sum[2 * v.size()];
    M0(sum);

    REP(i, v.size() + 1)
    {
        if (i == 0)
            sum[i] = 0;
        else
            sum[i] = sum[i - 1] + v[i - 1];
    }

    ll m = 0;

    int z_left = z_init ? 0 : 1;
    int z_right = z_left + 2 * (rev - 1);

    for (;;)
    {
        int left = max(z_left - 1, 0);
        int right = min(z_right + 1, (int)v.size() - 1);
        chmax(m, sum[right + 1] - sum[left]);

        z_left += 2;
        z_right += 2;

        if (right == (int)v.size() - 1)
            break;
    }

    cout << m << endl;
}