unittest
{
	assert( [ "5 1", "00010" ].parse.expand.solve == 4 );
	assert( [ "14 2", "11101010110011" ].parse.expand.solve == 8 );
	assert( [ "1 1", "1" ].parse.expand.solve == 1 );
}



import std.algorithm;
import std.conv;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto nk = input.front.split.to!( long[] );
	input.popFront;
	auto s = input.front;
	return tuple( nk[ 1 ], s );
}

auto solve( long k, string s )
{
	// 連続した同じ体制の人をグループにする
	auto gs = s.group.array;
	
	// 後続の処理を楽にするために入力の形を整える
	if( gs[ 0     ][ 0 ] == '0' ) gs = [ Tuple!( dchar, uint )( '1', 0 ) ] ~ gs;
	if( gs[ $ - 1 ][ 0 ] == '0' ) gs = gs ~ [ Tuple!( dchar, uint )( '1', 0 ) ];
	
	// 人数の累積和を計算
	auto ss = new long[ 1 + gs.length ];
	for( auto i = 1L; i < ss.length; i++ )
	{
		ss[ i ] = ss[ i - 1 ] + gs[ i - 1 ][ 1 ];
	}
	
	// 連続で逆立ちする人を並ばせられる最大数を検索
	auto ans = 0L;
	for( auto li = 1L; li < ss.length; li += 2 )
	{
		auto e = min( li + 1 + ( 2 * k ), ss.length );
		for( auto ri = li; ri < e; ri += 2 )
		{
			ans = max( ans, ss[ ri ] - ss[ li - 1 ] );
		}
	}
	return ans;
}
