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;

namespace ABC124

{
    class D
    {
        static void Main(string[] args)
        {
            int[] input = Console.ReadLine().Split().Select(int.Parse).ToArray();
            int N = input[0];
            int K = input[1];
            string S = Console.ReadLine();

            List<int> list = new List<int>();
            int count;

            for (int i = 0; i < S.Length; i++)
            {
                if (i == 0 && S[0] != '1')
                {
                    list.Add(0);
                }

                count = 1;
                while (1 < S.Length && i < S.Length - 1 && S[i] == S[i + 1])
                {
                    count++;
                    i++;
                }
                list.Add(count);
            }

            if (S.Length == 1)
            {
                if (S[0] == '1') { list.Add(1); list.Add(0); }
                else { list.Add(0); list.Add(1); }
            }

            var Count = list.ToArray();

            int[] CS = new int[Count.Length + 2];
            CS[0] = 0;
            for (int i = 1; i < Count.Length; i++)
            {
                CS[i] = CS[i - 1] + Count[i - 1];
            }
            CS[Count.Length] = CS[Count.Length - 1] + Count[Count.Length - 1];
            CS[Count.Length + 1] = CS[Count.Length - 1] + Count[Count.Length - 1];

            //if (CS.Length % 2 == 1) { CS[Count.Length + 1] = 0; }

            int max = 0;
            //if (CS.Length % 2 == 1) { lin = CS.Length + 1; lin2 = 2 * K; }
            //else { lin = CS.Length; lin2 = 2 * K + 1; }
            for (int i = 0; i + 2 * K + 1 < CS.Length; i += 2)
            {
                max = Math.Max(max, CS[i + 2 * K + 1] - CS[i]);
            }

            /*
            for (int i = 0; i + lin2 < lin; i += 2)
            {
                max = Math.Max(max, CS[i + lin2] - CS[i]);
            }
            */


            if (S.Length == 1) max = 1;
            if (CS.Length / 2 <= K) max = S.Length;


            /*
            int index = 0;
            foreach (var item in CS)
            {
                Console.WriteLine("cs" + index + " " + item);
                index++;
            }
             */

            Console.WriteLine(max);
        }
    }
}