luogu#P11105. [ROI 2023 Day 1] 解密
[ROI 2023 Day 1] 解密
题目背景
翻译自 ROI 2023 D1T2。
这是一道通信题。洛谷无法实现通信,所以这道题会使用函数交互的形式进行评测。
不要使用 C++14 (GCC 9)
语言提交。
Alesya 和 Boris 在计算机课上学习密码学。他们决定发明自己的一种加密消息的方法——BASE23(Boris-Alesya Super Encoding 2023)。
Alesya 从 到 选择了 个不同的整数,并将得到的集合称为 。
Alesya 想要以加密形式将集合 作为消息传递给 Boris。为此,根据集合 ,Alesya 将构建另一个集合 ,并将其传递给 Boris,该集合也由整数组成,范围在 到 之间。
Alesya 和 Boris 不希望加密后的消息大小发生变化(不像 BASE64 一样密文比明文长约 ),因此 也必须恰好包含 个数字。而且,他们认为如果 和 至少包含一个相同的数,则加密将不够可靠。因此,不应该存在一个既属于 又属于 的数字,即 。保证 ,因此始终可以根据集合 构建至少一个集合 。
当 Boris 收到加密消息 时,他将需要对其进行解密并获得原始消息 。
题目描述
帮助 Alesya 和 Boris 设计和实现 BASE23 的加密和解密算法。
在本题中,你的程序需要实现下面两个函数(不需要编写 main 函数):
std::vector<int> Encode(int n, int k, std::vector<int> T){
// 加密过程
return R;
}
std::vector<int> Decode(int n, int k, std::vector<int> R){
// 解密过程
return T;
}
你的 Encode
函数将扮演 Alesya 的角色,对数组进行加密。而 Decode
函数则将扮演 Boris 的角色,通过解密来得到原来的数组。 和 都按照递增顺序排列。
刚开始,交互库会根据该数据点的数据调用你编写的 Encode
函数,根据它的返回值判断该加密算法是否合法。接着,交互库调用 Decode
函数,判断它的返回值是否与原来的数据相同。如果相同,则认为这一份 BASE23 加解密代码是正确的。
交互库会多次调用这两个函数,对应了原题中有多组数据。交互库会先将每组数据的 全部加密,接着再按随机顺序把它们解密。具体的数据范围限制见“说明/提示”部分。
输入格式
使用函数交互,程序不需要进行输入。
输出格式
使用函数交互,程序不需要进行输出。
提示
交互库调用两个函数的次数(即数据组数)都不超过 。对于每一组数据,。对于每一个测试点,。
原题的加、解密时间限制均为 ,空间限制均为 ,不过由于在洛谷实现通信题的方式特殊,本题由特殊的时空限制。(目前的时空限制可能无法通过本题 qwq)
如果你在本题莫名 CE,你可以尝试换一个语言提交。
当你 UKE 时,查看你的错误提示。如果提示中含有“timeout”,应该是超时了。
交互库编写: