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 Haskell (GHC 7.10.3) (judge verdict: Runtime Error)

import Data.List
main = do
  [n,k] <- map read . words <$> getLine :: IO[Int]
  s <- getLine
  let gs = group s
  let g0 = map length (filter (\x -> head x == '0') gs)
  let g1 = map length (filter (\x -> head x == '1') gs)
  let g12 = zipWith (+) g0 g1
  let ians = if k >= length g0 then sum g12 else (if head s == '0' then sum (take k g12) else sum (take k g12) + g1 !! k)
  print $ if head s == '0' then maximum (f g12 g0 [ians] k) else maximum (g g12 g1 [ians] k)

f x12 x0 ans y
  | y > length x12 = ans
  | y <= length x12 = f (tail x12) (tail x0) (ans ++ [last ans - head x0 + x12 !! y]) y
g x12 x1 ans y
  | y > length x12 = ans
  | y == length x12 = ans ++ [sum x12]
  | y-1 == length x12 = g (tail x12) (tail x1) (ans ++ [last ans - head x12 + x12 !! y + last x1 ]) y
  | y-1 < length x12 = g (tail x12) (tail x1) (ans ++ [last ans - head x12 + x12 !! y + x1 !! (y+1)]) y