P11404 [RMI 2020] 蝶变 / Brperm
题目背景
译自 [8th Romanian Master of Informatics, RMI 2020](https://rmi.lbi.ro/rmi_2020/) D1T2。$\texttt{2s,0.25G}$。
「我,也会有蜕变成蝶的一天吗?」
**附件提供了 Sample grader**。
提交时,**不需要**引入 `brperm.h`。
题目描述
**这是一道(函数式)交互题。**
定义一个长度为 $2^k$ 的序列 $[a_0,a_1,\cdots,a_{2^k-1}]$ **蝶变**之后的结果为 $[a_{\operatorname{rev}(0)},a_{\operatorname{rev}(1)},\cdots,a_{\operatorname{rev}(2^k-1)}]$,其中 $\operatorname{rev}(i)$ 表示将 $i$ 的二进制表示下最低 $k$ 位翻转(reverse)后得到的结果。更为具体地说,令 $i=\overline{b_kb_{k-1}\cdots b_1}$,则 $\operatorname{rev}(i)=\overline{b_1b_{2}\cdots b_k}$。
定义一个长度为 $2^k$ 的序列是**美的**,当且仅当蝶变后的序列与原序列相同。
给定一个长度为 $N$ 的字符串 $s$,字符集为小写英文字母。$Q$ 次询问给定 $i,k$,问 $s[i:i+2^k-1]$ 是否是美的。
### 实现细节
你不需要,也不应该实现 main 函数。
你需要实现以下的函数:
```cpp
void init(int N, const char s[]);
int query(int i, int k);
```
交互库会调用 `init` 函数恰好一次。参数的含义:
- `N`:字符串长度。
- `s`:字符串。
接下来调用 $Q$ 次 `query` 函数。这里,$0\le i\lt N$。
**注意:不保证 $\textcolor{red}{i+2^k\le N}$**。如果 $i+2^k\gt N$,返回 $0$ 即可。
返回 `1`,代表所查询的子串是美的;否则代表它不是美的。
输入格式
这里提供的是 Sample grader 的输入格式。
第一行,一个字符串 $s$。
接下来若干行,每行两个正整数 $i,k$ 描述一次询问。输入直到 EOF。
输出格式
这里提供的是 Sample grader 的输出格式。
对于每个询问,输出一行一个整数 $\texttt{0}/\texttt{1}$,表示答案。
说明/提示
对于 $100\%$ 的数据,保证 $1\le N,Q\le 5\times 10^5$。
| 子任务编号 | $N,Q\le $ | 特殊性质 | 得分 |
| :--: | :--: | :--: | :--: |
| $ 1 $ | $ 10^3 $ | | $13$ |
| $ 2 $ | $ 10^5 $ | | $37$ |
| $ 3 $ | $ 5\times 10^5 $ | A | $17$ |
| $ 4 $ | $ 5\times 10^5 $ | | $33$ |
- 特殊性质 A:$s$ 中只有字母 $\texttt{a},\texttt{b}$,且每个字母是以某个固定比例独立随机从字符集中选取的。
**注意:不保证 $\textcolor{red}{i+2^k\le N}$**。如果 $i+2^k\gt N$,返回 $0$ 即可。