loj#P4788. 「RMI 2020」Brperm

「RMI 2020」Brperm

注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "brperm.h"

题目描述

题目译自 Romanian Master of Informatics 2020 Day1 T2 「Brperm

注意:在以下描述中,b1bk\overline{b_{1} \ldots b_{k}} 表示一个以二进制表示的整数,其中 b1b_{1} 是最高有效位,bkb_{k} 是最低有效位。

太空女巫 Roxanne 在骑着她的扫帚穿越银河系时,发现了一个奇怪的星球——Br-PERM 星球。在这个星球上,每个人都跳一种奇怪的舞蹈:这场舞蹈中,你需要排成一列,然后重新调整自己的位置。假设有 2k2^{k} 个人在跳舞,那么位置 b1bk\overline{b_{1} \ldots b_{k}} 的人会移动到位置 bkb1\overline{b_{k} \ldots b_{1}}(编号从 00 开始)。

Roxanne 还注意到,Br-PERM 星球上的每个人都穿着 2626 种颜色之一的衣服,这些颜色由拉丁字母表示。

Br-PERM 星球的人们对舞者在跳舞前后衣服颜色序列相同的情况赋予了特殊的意义,他们称这种序列为完美的 。例如,当 k=2k=2 时,我们有一排四个舞者 0,1,2,30,1,2,3,跳舞后他们的顺序变为:0,2,1,30,2,1,3。因此,衣服颜色序列 abba 是完美的 ,但 abca 不是。

Br-PERM 星球的人们请 Roxanne 帮助他们解决一个难题(太空女巫似乎总是要帮助别人解决问题)。他们展示了一长排 nn 个舞者,并问她几个问题:「从第 ii 个舞者开始,长度为 2k2^{k} 的序列是否是完美的 ?」

实现细节

你必须实现两个函数。第一个函数如下:

void init(int n, const char s[]);

这个函数将在交互开始时被调用一次,并通过参数 ss 向你提供舞者的衣服颜色字符串。

你必须实现的第二个函数是:

int query(int i, int k);

这个函数将被调用 QQ 次,只有当从第 ii 个舞者(编号从 00 开始)开始,长度为 2k2^{k} 的连续子序列是完美的时,才返回 11。否则返回 00。保证子序列不会超过 ss 的末尾。

样例

输入 输出
init(8, "axxyxxyb") query(0,3) = true
query(1,1) = true
query(0,2) = false
query(3,2) = true

数据范围与提示

对于所有输入数据,满足:

  • 1N51051 \leq N \leq 5\cdot 10^5
  • 1Q51051 \leq Q \leq 5\cdot 10^5

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
11 1313 1N10001 \leq N \leq 10001Q10001 \leq Q \leq 1000
22 3737 1N1051 \leq N \leq 10^51Q1051 \leq Q \leq 10^5
33 1717 ss 仅包含字符 ab;每个测试点中的颜色是根据一定的固定概率独立随机选择的
44 3333 无附加限制