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: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static int N;
    static int K;
    static string S;

    public static void Main(string[] args)
    {
        N = Input.NextInt();
        K = Input.NextInt();
        S = Input.NextString();


        if (S.Length == 1)
        {
            Console.WriteLine(1);
            return;
        }

        var store = new List<int>();

        bool fs = false;
        if (S[0] != '0')
        {
            S = "0" + S;
            fs = true;
        }
        int cur = 1;
        for (int i = 1; i < S.Length; i++)
        {
            if (S[i - 1] != S[i])
            {
                store.Add(cur);
                cur = 1;
            }
            else
            {
                cur++;
            }
        }
        store.Add(cur);
        if (fs)
            store[0] = 0;
        if ((store.Count % 2) != 0)
            store.Add(0);

        if (store.Count == 2)
        {
            Console.WriteLine(S.Length);
            return;
        }

        var x = new List<int>();
        var y = new List<int>();
        x.Add(0);
        y.Add(0);
        for (int i = 0; i < store.Count / 2; i++)
        {
            x.Add(store[i * 2]);
            y.Add(store[i * 2 + 1]);
        }
        int ans = 0;

        for (int i = 0; i < x.Count - K; i++)
        {
            int qq = y[i];
            for (int j = 0; j < K; j++)
            {
                qq += x[i + j + 1];
                qq += y[i + j + 1];
            }
            ans = Math.Max(ans, qq);
        }
            Console.WriteLine(ans);
    }
}

public static class Input
{
    private static Queue<string> q = new Queue<string>();
    private static void Confirm() { if (q.Count == 0) foreach (var s in Console.ReadLine().Split(' ')) q.Enqueue(s); }
    public static int NextInt() { Confirm(); return int.Parse(q.Dequeue()); }
    public static long NextLong() { Confirm(); return long.Parse(q.Dequeue()); }
    public static string NextString() { Confirm(); return q.Dequeue(); }
    public static double NextDouble() { Confirm(); return double.Parse(q.Dequeue()); }
    public static int[] LineInt() { return Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); }
    public static long[] LineLong() { return Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); }
    public static string[] LineString() { return Console.ReadLine().Split(' ').ToArray(); }
    public static double[] LineDouble() { return Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); }
}