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++14 (GCC 5.4.1) (judge verdict: Accepted)

/*

    author : s@if

*/

#include<bits/stdc++.h>
using namespace std;
#define NIL -1
#define fi first
#define sec second
#define MAX INT_MAX
#define INF 99999999
#define ll long long
#define PI acos(-1.0)
#define MOD 1000000007
#define PLL pair<ll,ll>
#define PII pair<int,int>
#define ull unsigned long long
#define triplell pair<pair<ll,ll> , ll>
#define triple pair<pair<int,int> , int>
#define For(i,n) for(int i=0;i<(int)n;i++)
#define Forn(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define forba(i,a,b) for(int i=(int)b;i>=(int)a;i--)

int dx[]={+1,-1,+0,+0};
int dy[]={+0,+0,+1,-1};
int fx[]={+0,+0,+1,-1,-1,+1,-1,+1};
int fy[]={-1,+1,+0,+0,+1,+1,-1,-1};
int hr[]={-2,-2,-1,+1,+2,+2,-1,+1};
int hc[]={+1,-1,+2,+2,-1,+1,-2,-2};

const int MAXN = (int)1e5+9;
int L[MAXN],R[MAXN],Z[MAXN];

struct node
{
	int l, r;
	
	node(int _l, int rr)
	{
		l=_l;
		r=rr;
	}
};

int main()
{
/*	freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);  */
    
    int i,j,k,l,m,n,p,q,x,y,u,v,r,tc,t;
    
    cin>>n>>k;
    string s ;
    
    cin>>s;
    
    l=s.size();
    
    memset(L,0,sizeof(L));
    memset(R,0,sizeof(R));
    memset(Z,0,sizeof(Z));
    
    int cnt = 0;
    for(i=0;i<l;)
    {
    	if(s[i]=='0')
    	{
    		L[i]=cnt;
    		cnt = 0;
    		
    		j=i;
    		while(i<l && s[i]=='0')
    		{
    			Z[j]++;
    			i++;
			}
		}
		else
		{
			i++;
			cnt++;
		}
	}
	
	cnt = 0;
	for(i=l-1;i>=0;)
	{
		if(s[i]=='1')
		{
			cnt++;
			i--;
		}
		else
		{
			while(i>=0 && s[i]=='0')
			{
				i--;
			}
			
			R[i+1]=cnt;
			cnt=0;
		}
	}
	
	int ans = 0;
	vector<node>vec;
	
	for(i=0;i<l;)
	{
		if(s[i]=='0')
		{
		//	cout<<i<<" "<<L[i]<<" "<<R[i]<<" "<<Z[i]<<endl;
			vec.push_back(node(i-L[i],i+R[i]+Z[i]-1));
			
			while(i<l && s[i]=='0')
			{
				i++;
			}
		}
		else
			i++;
	}
	
	ans = 0;
	
	for(i=0;i<vec.size();i++)
	{
		j=i+k-1;
		if(j>=vec.size())
			j=vec.size()-1;
			
		int mx = vec[j].r-vec[i].l+1;
		ans=max(ans,mx);
	}
	
	if(ans==0)
		ans = n;
		
	cout<<ans<<endl;
	
//	main();

    return 0;
}