这是一道通信题。
Flower,Huahua 与 Qingyu 是一群要好的好朋友,他们将在一起组队参加 P 国主办的 Pb 学奥林匹克竞赛。
在本次竞赛中,三人团队需要解决这样一个问题:
- Flower 与 Huahua 手中分别有 N 个长度恰好为 L 的
0/1
序列。- Flower 手中的序列为 A0,A1,⋯,AN−1,Huahua 手中的序列为 B0,B1,⋯,BN−1。
- 随后,裁判选定 Q 组 (xi,yi),满足 0≤xi,yi<N。注意有可能 xi=yi。
- 对每个 0≤i<Q,生成一个长度恰好为 L 的
0/1
串 Ci,满足对任意 0≤j<N,都有 Ci[j]=Axi[j]⊕Byi[j]。其中 ⊕ 为按位异或运算。 - 裁判将这 Q 个串 C0,C1,⋯,CQ−1 均发送给 Qingyu,但 Qingyu 手中没有 A 与 B 的任何信息。
- Qingyu 的任务是找到 Q 组 (x′i,y′i),满足对任意 0≤i<Q,0≤j<N,都有 Ci[j]=Ax′i[j]⊕By′i[j]。
显然这个任务对于 Qingyu 来说实在是过于困难。好在 Flower 与 Huahua 拥有超能力,可以对 Qingyu 单向发送悄悄话。具体地,Flower 与 Huahua 每个人都可以向 Qingyu 发送一个长度恰好为 M=6000 的 0/1
串,来作为一些提示。可惜的是,Qingyu 并不具备同样的能力,因此其只能单向接受信息,而不能向他们进行提问。
整个团队的得分取决于 Qingyu 对问题回答的正确率 P。当 P≥99% 时,团队即可获得满分。
现在,他们需要你的帮助,来设计每个人的策略,使得他们的目标能够达成。
形式化的题意
两个程序 Flower
与 Huahua
各有 N 个 L 位二进制数 A0⋯N−1 与 B0⋯n−1(可能有前导零)。他们各自可以向第三个程序 Qingyu
发送一些信息。第三个程序需要回答 Q 组询问,每组询问需要找到两个下标 i,j,使得 Ai 异或 Bj 恰好为给定的二进制数。保证至少存在一组合法的解。
实现细节
这是一道通信题,本题仅支持 C++ 语言。
你需要提交三个程序,其中程序 Flower
描述 Flower 向 Qingyu 发送信息的策略,程序 Huahua
描述 Huahua 向 Qingyu 发送信息的策略,程序 Qingyu
描述 Qingyu 收到裁判给定的信息、Flower 的悄悄话与 Huahua 的悄悄话后,回答问题的策略。
Flower
你所提交的第一个程序为 Flower
,描述 Flower 向 Qingyu 发送信息的策略。
你需要包含头文件 Flower.h
,并实现以下函数:
std::string FlowerMessage(int T, int N, int L, std::vector<std::string> A);
- 在每个测试点中,该函数会被调用恰好一次。
- 参数 T 表示当前子任务的编号。
- 参数 N 的含义即为题目中的 N。
- 参数 L 的含义即为题目中的 L。
- 参数 A 为一个长度为 N 的数组,其中 A[i] (0≤i<N) 为一个长度恰好为 L 的字符串,描述 Ai。
- 你需要返回一个长度恰好为 M=6000 的、只由
0
和1
构成的字符串 SF,描述 Flower 所要发送的信息。
Huahua
你所提交的第二个程序为 Huahua
,其描述 Huahua 向 Qingyu 发送信息的策略。
你需要包含头文件 Huahua.h
,并实现以下函数:
std::string HuahuaMessage(int T, int N, int L, std::vector <std::string> B);
- 在每个测试点中,该函数会被调用恰好一次。
- 参数 T 表示当前子任务的编号。
- 参数 N 的含义即为题目中的 N。
- 参数 L 的含义即为题目中的 L。
- 参数 B 为一个长度为 N 的数组,其中 B[i] (0≤i<N) 为一个长度恰好为 L 的字符串,描述 Bi。
- 你需要返回一个长度恰好为 M=6000 的、只由
0
和1
构成的字符串 SH,描述 Huahua 所要发送的信息。
Qingyu
你所提交的第三个程序为 Qingyu
,其描述 Qingyu 回答问题的策略。
你需要包含头文件 Qingyu.h
,并实现以下函数:
std::vector <std::pair <int, int> > Solve(int T, int N, int L, int Q, std::vector <std::string> C, std::string SF, std::string SH);
- 在每个测试点中,该函数会被调用恰好一次。
- 参数 T 表示当前子任务的编号。
- 参数 N 的含义即为题目中的 N。
- 参数 L 的含义即为题目中的 L。
- 参数 Q 的含义即为题目中的 Q。
- 参数 C 为一个长度为 Q 的数组,其中 C[i] (0≤i<Q) 为一个长度恰好为 L 的字符串,描述 Ci。
- 参数 SF 为一个长度恰好为 M=6000 的、只由
0
和1
构成的字符串 SF,描述 Flower 所要发送的信息。 - 参数 SH 为一个长度恰好为 M=6000 的、只由
0
和1
构成的字符串 SH,描述 Flower 所要发送的信息。 - 你需要返回一个长度恰好为 Q=500 的、由二元组 (x′,y′) 构成的数组。第 i (0≤i<Q) 个二元组描述了 x′i+1,y′i+1 的值。
- 对于某组询问,如果存在多个符合条件的二元组,你可以输出任意一个。
- 输入数据保证至少存在一对合法的 (x′,y′)。
样例交互库
本题下发文件中含有样例交互库 grader.cpp
,选手可使用以下命令编译得到可执行文件:
g++ Flower.cpp Huahua.cpp Qingyu.cpp grader.cpp -o answer -O2 -std=c++14
可执行文件将从标准输入中通过以下格式读取输入数据:
- 输入的第一行包含四个整数 T,N,L,Q。
- 接下来 N 行,第 i 行包含一个长度恰好为 L 的
0/1
串,描述每个 A[]。 - 接下来 N 行,第 i 行包含一个长度恰好为 L 的
0/1
串,描述每个 B[]。 - 接下来 Q 行,第 i 行包含一个长度恰好为 L 的
0/1
串,描述每个 C[]。
可执行文件将向标准输出中输出以下数据:
- 若通信过程出现了错误,则输出对应的错误信息。
- 否则,输出将包含恰好 Q 行,每行两个整数 xi,yi,描述选手的答案。
需要注意的是,样例交互库既不会检查选手的程序是否使用了非法手段传递信息,也不会检查你最终输出的答案是否正确。
在最终评测时,程序 Flower
、Huahua
与 Qingyu
将被分别编译并在三个不同的进程中运行。本题的时间限制(1.0 秒)与空间限制(256 MiB)均指每个进程所能使用的时间与空间的最大值。在任意一个进程中超过该限制都会导致发生相应的错误。保证在最终评测时,三个程序各自的交互库使用的时间不超过 0.1 秒,空间不超过 16 MiB,即选手至少有 0.9 秒的时间与 240 MiB 的空间可用。
最终评测时所使用的交互库是 non-adaptive 的,即所有给定的串均在你的程序运行前固定,不会根据 Flower 与 Huahua 所返回的信息进行动态构造。
请注意,你不需要,也不能从标准输入中读取任何数据,也不能向标准输出中输出任何信息,否则可能导致通信的过程出现异常。
样例数据
样例 1
见下发文件。
本组样例满足子任务 1 的特殊限制。
样例 2
见下发文件。
本组样例满足子任务 2 的特殊限制。
样例 3
见下发文件。
本组样例满足子任务 3 的特殊限制。
子任务
请注意,本题满分为 50 分。
对于除样例外的所有数据,Q=500,N 与 L 的范围如表所示:
子任务编号 | N= | L= | 特殊性质 | 分值 |
---|---|---|---|---|
1 | 100 | 30 | 无 | 5 |
2 | 100 | 5 | ||
3 | 200 | 1000 | A | 10 |
4 | 无 | 30 |
- 特殊性质 A:保证 A[i],B[i] 的生成方式均为每位独立在
0
与1
中均匀随机生成。本组子任务中仅有 10 组测试数据。
在每个测试点中,记满分为 S,你可以根据正确率 P 得到部分分:
P | 分值 |
---|---|
0.99≤P | 1.0×S |
0.90≤P<0.99 | P×S |
0.50≤P<0.90 | P2×S |
P<0.50 | P3×S |
即,为了获得满分,你需要在 500 组询问中正确回答至少 495 组。
Hack
Hack 功能在本题中不可用。