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 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include<stdio.h>
#include<stdlib.h>

#define NEW(p,n){p=malloc((n)*sizeof(p[0]));if(p==NULL){printf("not enough memory\n");exit(1);};}
//pの型の変数n個の要素分のメモリを確保し、そのアドレスをpに代入するマクロ

#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))

typedef struct{
    int n; //ブロック中の文字数
    char c; //ブロックの文字
}block;

void array_blocked(char* S, int N, block* A){
    int a=0;
    int count=1;

    for(int i=1;i<N;i++){
        if(S[i-1]==S[i]){
            count++;
        }
        else{
            A[a].n=count;
            A[a].c=S[i-1];
            a++;
            count=1;
        }
    }
    A[a].n=count;
    A[a].c=S[N-1];
    return;
}

int main(void){
    int N,K;
    scanf("%d%d",&N,&K);

    char S[N+1];
    scanf("%s",S);

    block* B;
    NEW(B,N+1);
    array_blocked(S,N,B);

    //ブロックの数
    int blo=0;
    while(B[blo].n!=0){
        blo++;
    }

    int A[blo];
    for(int i=0;i<blo;i++){
        A[i]=0;

        //B[end]まで足す
        int end;
        if(B[i].c=='0'){
            end=i+2*(K-1)+1;
            end=MIN(end,blo-1);
        }
        else{
            end=i+2*K;
            end=MIN(end,blo-1);
        }

        for(int j=i;j<=end;j++) A[i]+=B[j].n;
    }

    int ans=0;
    for(int i=0;i<blo;i++){
        if(A[i]>=ans) ans=A[i];
    }
    printf("%d\n",ans);

    return 0;
}