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# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using static System.Console;
using static System.Convert;
using static System.Math;
using Pair = System.Tuple<int, int>;
using Edge = System.Tuple<int, int, long>;
//using Debug;
//using static System.Globalization.CultureInfo;

class Program
{
    static void Main(string[] args)
    {
        Solve();
        //WriteLine(Solve());
    }
    static void Solve()
    {
        var nk = Input.ar;
        var str = ReadLine();
        var len1 = new List<int>();
        var len0 = new List<int>();
        var ct = 1;
        for (var i = 1; i < nk[0]; i++)
        {
            if (str[i - 1] == str[i])
                ct++;
            else
            {
                if (str[i - 1] == '0') len0.Add(ct);
                else len1.Add(ct);
                ct = 1;
            }
        }
        if (str[nk[0]-1] == '0') len0.Add(ct);
        else len1.Add(ct);
        var sum1 = new int[len1.Count + 2];
        for (var i = 1; i <= len1.Count; i++)
            sum1[i] = sum1[i - 1] + len1[i - 1];
        sum1[len1.Count + 1] = sum1[len1.Count];
        var sum0 = new int[len0.Count + 1];
        for (var i = 1; i <= len0.Count; i++)
            sum0[i] = sum0[i - 1] + len0[i - 1];
        var res = 0;
        if(len0.Count<nk[1])
        {
            res = str.Length;
        }
        for (var i = 0; i < len0.Count - nk[1]+1; i++)
        {
            var calc = sum0[i + nk[1]] - sum0[i];
            if (str[0] == '0')
            {
                if (i == 0)
                    calc += sum1[i + nk[1]] - sum1[i];
                else calc += sum1[i + nk[1]] - sum1[i - 1];
            }
            else
            {
                calc += sum1[i + nk[1] + 1] - sum1[i];
            }
            res = Max(res, calc);
        }
        if (len1.Count == 1) res = Max(len1[0], res);
        WriteLine(res);
    }
}

public class Input
{
    public static string read => ReadLine();
    public  static int[] ar => Array.ConvertAll(read.Split(' '), int.Parse);
    public  static int num => ToInt32(read);
    public static long[] arL => Array.ConvertAll(read.Split(' '), long.Parse);
    public  static long numL => ToInt64(read);
    public static char[][] gred(int h) 
        => Enumerable.Repeat(0, h).Select(v => read.ToCharArray()).ToArray();
    public static int[][] ar2D(int num)
        => Enumerable.Repeat(0, num).Select(v => ar).ToArray();
    public static long[][] arL2D(int num)
        => Enumerable.Repeat(0, num).Select(v => arL).ToArray();
    public const long Inf = (long)1e18;
    public const double eps = 1e-6;
    public  const string Alfa = "abcdefghijklmnopqrstuvwxyz";
    public  const int MOD = 1000000007;
}