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 PyPy3 (2.4.0) (judge verdict: Accepted)

def main():
    N, K = map(int, input().split())
    S = input()
    seq = []
    current = "1"
    cnt = 0
    # 初手が0だと0の累積和が最初に入る(e.g. [1,2,1]が[0,1,2,1]となる)
    # ex. 0001011ならseq = [3,1,1,2] (0が3つ,1が1つ,0が2つ,1が2つ)
    for c in S:
        if c == current:
            cnt += 1
        else:
            seq.append(cnt)
            current = c
            cnt = 1
    seq.append(cnt)  # 切り替えのあったタイミングで初めて挿入されるので、最後のカウントは挿入されていないので、ここで入れる
    if len(seq) % 2 == 0:
        seq.append(0)  # 0挿入なので、大勢には影響しない。理由は不明。

    # K1回で2つの切り替え00010001 = [3,1,3,1]=>右の0３つを変えると=>[3,4]となる
    # 現在seqに格納されているのは切り替えデータだからK*2+1以内なら、全て1になる
    if len(seq) <= K*2+1:
        print(sum(seq))
        return
    ans = 0
    total = 0
    j = 0
    # Kで２つseqが消える→rangeはそれを差し引いた回数
    # 2Kの範囲でseqを前から進めていくansが最大となるものをキープし、出力する

    for i in range(len(seq)-K*2):
        while j < i+K*2+1:
            total += seq[j]
            j += 1
        if i % 2 == 0:
            ans = max(ans, total)
        total -= seq[i]  # 今回のtotalは既にキープしてあるので、動いて消える部分は取り除く
    print(ans)


if __name__ == "__main__":
    main()