刚上一年级的时候胖头鱼就学会了线段树这一处理区间问题有力的数据结构,现在三点五年级的胖头鱼已经能熟练的运用势能分析去维护各种东西,但是一直有一个问题萦绕在她的脑海里:
线段树的数组长度要开到长度 $n$ 的几倍?
相信对线段树同样烂熟于心的你会脱口而出:$4$ 倍!
为了统一线段树的写法,我们定义 $f(n)=dg(1, 1, n)$ 表示长度为 $n$ 的线段树所需要的数组的长度,$dg$ 写法(c++)如下:
int dg(int i, int x, int y) { if(x == y) return i; int m = x + y >> 1; return max(dg(i + i, x, m), dg(i + i + 1, m + 1, y)); }
胖头鱼想知道长度 $x\in[l,r]$ 里的,$f(x)\over x$ 最大的线段树是哪棵,如果有多棵 $f(x)\over x$ 都是最大的,要长度 $x$ 最小的。
第一行一个正整数 $n$,接下来一个长度为 $n$ 的01串,表示 $l$ 的二进制表示。
第二行一个正整数 $m$,接下来一个长度为 $m$ 的01串,表示 $r$ 的二进制表示。
01串从左往右表示二进制的高位到低位,数据保证最高位不为 $0$。
对于全部数据,保证$1 \le l \le r,1 \le n \le m \le 2*10^6$。
一行一个01串,表示 $x$ 的二进制表示,格式同输入。
1 1 3 100
100
样例解释:
$l=(1)_2=1,r=(100)_2=4$
$f(1)=1,~f(1)/1=1$
$f(2)=3,~f(2)/2={3 \over 2}$
$f(3)=5,~f(3)/3={5 \over 3}$
$f(4)=7,~f(4)/4={7 \over 4}$
比值最大的是${7 \over 4}$,所以$x=4$。
$x=(100)_2$,所以$ans=100$。