Aisha 和 Basma 是两位互相通信的朋友。Aisha 有一条消息
然而第三个人 Cleopatra 在破坏 Aisha 和 Basma 之间的通信,能够篡改发送的数据包。在每个数据包中,Cleopatra 可以修改恰好
表示位置为 的比特可以被 Cleopatra 修改。我们称此类位置是被 Cleopatra 控制的。 表示位置为 的比特不能被 Cleopatra 修改。
数组
令
每个数据包发送后,Aisha 会立刻知道被篡改后的数据包内容。
当 Aisha 发送完所有数据包后,Basma 按照发送顺序接收到所有被篡改的数据包,她必须重建原始消息
你的任务是制定并实现某种策略,使得 Aisha 给 Basma 发送消息
实现细节
你要实现的第一个函数是:
void send_message(std::vector<bool> M, std::vector<bool> C)
:长度为 的数组,描述 Aisha 想要发给 Basma 的消息。 :长度为 的数组,标记 Cleopatra 控制的数据包中的位置。- 每个测试用例中,该函数最多可被调用2100次。
该函数调用以下函数来发送数据包:
std::vector<bool> send_packet(std::vector<bool> A)
:原始数据包(长度为 的数组),表示 Aisha 发送的比特。- 此函数返回篡改数据包
,表示 Basma 接收到的比特。 - 此函数在
send_message
的一次调用过程中最多被调用 次。
你要实现的第二个函数是:
std::vector<bool> receive_message(std::vector<std::vector<bool>> R)
:描述若干篡改数据包的数组。这些数据包源自 Aisha 在一次send_message
调用时发送的若干数据包,且按照 Aisha 的发送顺序排列。 的每个元素是长度为 的数组,表示一个篡改数据包。- 该函数应返回包含
个比特的数组,且与原始消息 相同。 - 每个测试用例中,该函数可能被调用多次。对于每次
send_message
的调用,对应地该函数要有恰好一次调用。函数receive_message
的调用顺序不必与对应的send_message
调用顺序一致。
注意在评测系统中,send_message
和 receive_message
两个函数是在不同的程序中来调用的。
约束条件
恰好有 个元素,且其中 个为 , 个为 。
子任务与评分
如果在任意的测试用例中,函数 send_packet
的调用不符合上述规则,或者某个函数 receive_message
的调用的返回值不正确,你的解答在该测试用例上得
否则,令 send_message
调用时调用函数 send_packet
的次数的最大值。令
那么,得分将由以下式子计算获得:
子任务 | 分数 | 额外的约束条件 |
---|---|---|
1 | ||
2 | 没有额外的约束条件。 |
注意在某些测试用例中,评测程序的行为是自适应的。这意味着 send_packet
的返回值可能取决于它的输入参数和以前调用该函数的返回值。
例子
考虑以下调用。
send_message([0, 1, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
Aisha 试图发给 Basma 的消息是
为便于解释这个例子,我们假设 Cleopatra 的行为是确定性的:她交替地用
Aisha 可以做出的一种决定是在一个数据包中发送原始消息中的两个比特,例如她是这样做的:通过她控制的前
于是 Aisha 发送以下数据包:
send_packet([0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
由于 Cleopatra 可以更改最后
Aisha 决定在第二个数据包中发送
send_packet([1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
根据假定的 Cleopatra 的策略,该函数返回:
Aisha 还可以发送更多的数据包,但她没有这样做。
然后评测程序进行以下函数调用:
receive_message([[0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]])
Basma 按照如下方式恢复消息 receive_message
调用的正确返回值。
可以证明,在假设的 Cleopatra 的策略下,对于长度为
评测程序示例
评测程序示例不具备自适应性,Cleopatra 的行为是确定性的,她交替地用
输入格式:输入第一行包含一个整数
S M[0] M[1] ... M[S-1] C[0] C[1] ... C[30]
输出格式:评测程序示例按照输入的顺序,用以下格式输出
K L D[0] D[1] ... D[L-1]
这里, send_packet
的调用次数,receive_message
返回的消息,
时间限制:
空间限制: