#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("inline")
#include<bits/stdc++.h>
using namespace std;
void * wmem;
char memarr[ 96000000 ] ;
template < class T> inline void walloc1d( T ** arr, int x, void ** mem = & wmem) {
static int skip[ 16 ] = { 0 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 } ;
( * mem) = ( void * ) ( ( ( char * ) ( * mem) ) + skip[ ( ( unsigned long long ) ( * mem) ) & 15 ] ) ;
( * arr) = ( T* ) ( * mem) ;
( * mem) = ( ( * arr) + x) ;
}
template < class T> inline void walloc1d( T ** arr, int x1, int x2, void ** mem = & wmem) {
walloc1d( arr, x2- x1, mem) ;
( * arr) - = x1;
}
template < class T> struct fenwick{
int size;
int memory;
T* data;
void malloc ( int mem) ;
void malloc ( int mem, int fg) ;
void walloc( int mem, void ** workMemory = & wmem) ;
void walloc( int mem, int fg, void ** workMemory = & wmem) ;
void free ( void ) ;
void init( int N) ;
void add( int k, T val) ;
T get( int k) ;
T range( int a, int b) ;
int kth( T k) ;
}
;
#define main dummy_main
int main( ) {
wmem = memarr;
return 0 ;
}
#undef main
fenwick< int > t;
class Solution{
public :
bool canReach( string s, int A, int B) {
int i;
dummy_main( ) ;
int N = s.size ( ) ;
t.walloc ( N,1 ) ;
t.add ( 0 ,1 ) ;
for ( i= ( 1 ) ; i< ( N) ; i++ ) {
if ( s[ i] == '0' ) {
if ( t.range ( i- B, i- A) ) {
t.add ( i,1 ) ;
}
}
}
return t.range ( N- 1 ,N- 1 ) ;
}
}
;
template < class T> void fenwick< T> :: malloc ( int mem) {
memory = mem;
data = ( T* ) std:: malloc ( sizeof ( T) * mem) ;
}
template < class T> void fenwick< T> :: malloc ( int mem, int fg) {
memory = mem;
data = ( T* ) std:: malloc ( sizeof ( T) * mem) ;
if ( fg) {
init( mem) ;
}
}
template < class T> void fenwick< T> :: walloc ( int mem, void ** workMemory /* = &wmem*/ ) {
memory = mem;
walloc1d( & data, mem, workMemory) ;
}
template < class T> void fenwick< T> :: walloc ( int mem, int fg, void ** workMemory /* = &wmem*/ ) {
memory = mem;
walloc1d( & data, mem, workMemory) ;
if ( fg) {
init( mem) ;
}
}
template < class T> void fenwick< T> :: free ( void ) {
memory = 0 ;
free ( data) ;
}
template < class T> void fenwick< T> :: init ( int N) {
size = N;
memset ( data,0 ,sizeof ( T) * N) ;
}
template < class T> void fenwick< T> :: add ( int k, T val) {
while ( k < size) {
data[ k] + = val;
k | = k+ 1 ;
}
}
template < class T> T fenwick< T> :: get ( int k) {
T res = 0 ;
while ( k>= 0 ) {
res + = data[ k] ;
k = ( k& ( k+ 1 ) ) - 1 ;
}
return res;
}
template < class T> T fenwick< T> :: range ( int a, int b) {
if ( a < 0 ) {
a = 0 ;
}
if ( b >= size) {
b = size - 1 ;
}
if ( b < a) {
return 0 ;
}
return get( b) - get( a- 1 ) ;
}
template < class T> int fenwick< T> :: kth ( T k) {
int i= 0 ;
int j= size;
int c;
T v;
while ( i< j) {
c = ( i+ j) / 2 ;
v = get( c) ;
if ( v <= k) {
i= c+ 1 ;
}
else {
j= c;
}
}
return i== size? - 1 : i;
}
// cLay version 20210524-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// fenwick<int> t;
//
// class Solution {
// public:
// bool canReach(string s, int A, int B) {
// dummy_main();
// int N = s.size();
// t.walloc(N,1);
// t.add(0,1);
// rep(i,1,N) if(s[i]=='0') if(t.range(i-B, i-A)) t.add(i,1);
// return t.range(N-1,N-1);
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk9mYXN0IikKI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJpbmxpbmUiKQojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwp2b2lkKndtZW07CmNoYXIgbWVtYXJyWzk2MDAwMDAwXTsKdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgd2FsbG9jMWQoVCAqKmFyciwgaW50IHgsIHZvaWQgKiptZW0gPSAmd21lbSl7CiAgc3RhdGljIGludCBza2lwWzE2XSA9IHswLCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxfTsKICAoKm1lbSkgPSAodm9pZCopKCAoKGNoYXIqKSgqbWVtKSkgKyBza2lwWygodW5zaWduZWQgbG9uZyBsb25nKSgqbWVtKSkgJiAxNV0gKTsKICAoKmFycik9KFQqKSgqbWVtKTsKICAoKm1lbSk9KCgqYXJyKSt4KTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgdm9pZCB3YWxsb2MxZChUICoqYXJyLCBpbnQgeDEsIGludCB4Miwgdm9pZCAqKm1lbSA9ICZ3bWVtKXsKICB3YWxsb2MxZChhcnIsIHgyLXgxLCBtZW0pOwogICgqYXJyKSAtPSB4MTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBzdHJ1Y3QgZmVud2lja3sKICBpbnQgc2l6ZTsKICBpbnQgbWVtb3J5OwogIFQqZGF0YTsKICB2b2lkIG1hbGxvYyhpbnQgbWVtKTsKICB2b2lkIG1hbGxvYyhpbnQgbWVtLCBpbnQgZmcpOwogIHZvaWQgd2FsbG9jKGludCBtZW0sIHZvaWQgKip3b3JrTWVtb3J5ID0gJndtZW0pOwogIHZvaWQgd2FsbG9jKGludCBtZW0sIGludCBmZywgdm9pZCAqKndvcmtNZW1vcnkgPSAmd21lbSk7CiAgdm9pZCBmcmVlKHZvaWQpOwogIHZvaWQgaW5pdChpbnQgTik7CiAgdm9pZCBhZGQoaW50IGssIFQgdmFsKTsKICBUIGdldChpbnQgayk7CiAgVCByYW5nZShpbnQgYSwgaW50IGIpOwogIGludCBrdGgoVCBrKTsKfQo7CiNkZWZpbmUgbWFpbiBkdW1teV9tYWluCmludCBtYWluKCl7CiAgd21lbSA9IG1lbWFycjsKICByZXR1cm4gMDsKfQojdW5kZWYgbWFpbgpmZW53aWNrPGludD4gdDsKY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGJvb2wgY2FuUmVhY2goc3RyaW5nIHMsIGludCBBLCBpbnQgQil7CiAgICBpbnQgaTsKICAgIGR1bW15X21haW4oKTsKICAgIGludCBOID0gcy5zaXplKCk7CiAgICB0LndhbGxvYyhOLDEpOwogICAgdC5hZGQoMCwxKTsKICAgIGZvcihpPSgxKTtpPChOKTtpKyspewogICAgICBpZihzW2ldPT0nMCcpewogICAgICAgIGlmKHQucmFuZ2UoaS1CLCBpLUEpKXsKICAgICAgICAgIHQuYWRkKGksMSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gdC5yYW5nZShOLTEsTi0xKTsKICB9Cn0KOwp0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGZlbndpY2s8VD46Om1hbGxvYyhpbnQgbWVtKXsKICBtZW1vcnkgPSBtZW07CiAgZGF0YSA9IChUKilzdGQ6Om1hbGxvYyhzaXplb2YoVCkqbWVtKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGZlbndpY2s8VD46Om1hbGxvYyhpbnQgbWVtLCBpbnQgZmcpewogIG1lbW9yeSA9IG1lbTsKICBkYXRhID0gKFQqKXN0ZDo6bWFsbG9jKHNpemVvZihUKSptZW0pOwogIGlmKGZnKXsKICAgIGluaXQobWVtKTsKICB9Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBmZW53aWNrPFQ+Ojp3YWxsb2MoaW50IG1lbSwgdm9pZCAqKndvcmtNZW1vcnkgLyogPSAmd21lbSovKXsKICBtZW1vcnkgPSBtZW07CiAgd2FsbG9jMWQoJmRhdGEsIG1lbSwgd29ya01lbW9yeSk7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBmZW53aWNrPFQ+Ojp3YWxsb2MoaW50IG1lbSwgaW50IGZnLCB2b2lkICoqd29ya01lbW9yeSAvKiA9ICZ3bWVtKi8pewogIG1lbW9yeSA9IG1lbTsKICB3YWxsb2MxZCgmZGF0YSwgbWVtLCB3b3JrTWVtb3J5KTsKICBpZihmZyl7CiAgICBpbml0KG1lbSk7CiAgfQp9CnRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQgZmVud2ljazxUPjo6ZnJlZSh2b2lkKXsKICBtZW1vcnkgPSAwOwogIGZyZWUoZGF0YSk7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBmZW53aWNrPFQ+Ojppbml0KGludCBOKXsKICBzaXplID0gTjsKICBtZW1zZXQoZGF0YSwwLHNpemVvZihUKSpOKTsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGZlbndpY2s8VD46OmFkZChpbnQgaywgVCB2YWwpewogIHdoaWxlKGsgPCBzaXplKXsKICAgIGRhdGFba10gKz0gdmFsOwogICAgayB8PSBrKzE7CiAgfQp9CnRlbXBsYXRlPGNsYXNzIFQ+IFQgZmVud2ljazxUPjo6Z2V0KGludCBrKXsKICBUIHJlcyA9IDA7CiAgd2hpbGUoaz49MCl7CiAgICByZXMgKz0gZGF0YVtrXTsKICAgIGsgPSAoayYoaysxKSktMTsKICB9CiAgcmV0dXJuIHJlczsKfQp0ZW1wbGF0ZTxjbGFzcyBUPiBUIGZlbndpY2s8VD46OnJhbmdlKGludCBhLCBpbnQgYil7CiAgaWYoYSA8IDApewogICAgYSA9IDA7CiAgfQogIGlmKGIgPj0gc2l6ZSl7CiAgICBiID0gc2l6ZSAtIDE7CiAgfQogIGlmKGIgPCBhKXsKICAgIHJldHVybiAwOwogIH0KICByZXR1cm4gZ2V0KGIpIC0gZ2V0KGEtMSk7Cn0KdGVtcGxhdGU8Y2xhc3MgVD4gaW50IGZlbndpY2s8VD46Omt0aChUIGspewogIGludCBpPTA7CiAgaW50IGo9c2l6ZTsKICBpbnQgYzsKICBUIHY7CiAgd2hpbGUoaTxqKXsKICAgIGMgPSAoaStqKS8yOwogICAgdiA9IGdldChjKTsKICAgIGlmKHYgPD0gayl7CiAgICAgIGk9YysxOwogICAgfQogICAgZWxzZXsKICAgICAgaj1jOwogICAgfQogIH0KICByZXR1cm4gaT09c2l6ZT8tMTppOwp9Ci8vIGNMYXkgdmVyc2lvbiAyMDIxMDUyNC0xCgovLyAtLS0gb3JpZ2luYWwgY29kZSAtLS0KLy8gI2RlZmluZSBtYWluIGR1bW15X21haW4KLy8ge30KLy8gI3VuZGVmIG1haW4KLy8gCi8vIGZlbndpY2s8aW50PiB0OwovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgYm9vbCBjYW5SZWFjaChzdHJpbmcgcywgaW50IEEsIGludCBCKSB7Ci8vICAgICBkdW1teV9tYWluKCk7Ci8vICAgICBpbnQgTiA9IHMuc2l6ZSgpOwovLyAgICAgdC53YWxsb2MoTiwxKTsKLy8gICAgIHQuYWRkKDAsMSk7Ci8vICAgICByZXAoaSwxLE4pIGlmKHNbaV09PScwJykgaWYodC5yYW5nZShpLUIsIGktQSkpIHQuYWRkKGksMSk7Ci8vICAgICByZXR1cm4gdC5yYW5nZShOLTEsTi0xKTsKLy8gICB9Ci8vIH07Cg==