当你居住在芬兰的森林里,远离所有城市时,互联网连接的质量会发生剧烈波动。这在进行程序设计竞赛时有明显的劣势,尤其是大多数比赛都在线进行的情况下。
为了提高互联网连接的可靠性,互联网工程任务组(IETF)于 1990 年 4 月 1 日发布了一项名为“IP over Avian Carriers”(IP 承载于禽类载体)的标准。该标准描述了如何利用鸟类来传输互联网流量。鸟类不会受到诸如电缆切断或停电等问题的影响,因此可以作为标准互联网连接的有效备用方案。不幸的是,鸟类也会遇到其他问题。当发送多只携带数据的鸟时,它们不会按顺序送达数据,有时鸟儿甚至会在途中丢失。
你的任务是实现两个程序,为这种鸟类传输协议增加一些冗余——一个编码器和一个解码器。编码器将获得一个由 $C \cdot N$ 个比特(即数字 0 或 1)组成的字符串 $X$,其中 $N > 1$。它应该生成一个包含 $K$ 个元素的向量 $S[0], S[1], \dots, S[K - 1]$,其中每个 $S[i]$ 都是一个长度为 $N$ 的比特字符串。
之后,你的解码器将获得该向量中 $C$ 个元素的子集。它随后应该输出原始比特字符串 $X$。
编码器
你的编码器应实现函数 vector<string> encode(int C, int K, int N, string X)。它将从任务描述中获得整数 $C, K$ 和 $N$,以及比特字符串 $X$。$X$ 的长度为 $C \cdot N$,且仅由字符 0 和 1 组成。
编码器应输出一个包含 $K$ 个字符串的向量。每个字符串的长度应为 $N$,且仅包含字符 0 和 1。
解码器
解码器应实现函数 string decode(int C, int K, int N, vector<string> Y, vector<int> I)。它将从任务描述中获得整数 $C, K$ 和 $N$,以及由 encode(C, K, N, X) 输出的字符串 $S$ 的一个子集 $Y$。$Y$ 和 $I$ 的长度均为 $C$。$I$ 将包含从编码器中取出的字符串的从零开始的索引,使得 $Y[i]$ 是第 $I[i]$ 个字符串(即 $Y[i] = S[I[i]]$)。
解码器应输出长度恰好为 $C \cdot N$ 的原始字符串 $X$。
实现细节
你可以使用 C++、Java、Python 或 C# 实现你的解决方案。你可以从此处下载需要实现的模板。注意,你只能提交 avian.cpp、avian.java、avian.py 或 avian.cs 文件中的一个。
说明:在此任务中,你不应使用标准输入或标准输出(即读取或写入终端)。这样做很可能会导致令人困惑的错误。
此外,程序在运行解码器之前会重新启动。因此,你使用的任何全局状态都将被清除。
子任务
你的解决方案将根据一组子任务进行评分。一个子任务将包含多个测试用例。要获得子任务的分数,你的解决方案必须通过该子任务中的所有测试用例。
| 子任务 | 分数 | 数据范围 |
|---|---|---|
| 1 | 30 | $C = 3, K = 4, 1 < N \le 1000$ |
| 2 | 25 | $C = 2, K = 4, 1 < N \le 1000, N \equiv 0 \pmod 2$ 即 $N$ 为偶数 |
| 3 | 20 | $C = 2, K = 4, 1 < N \le 1000$ |
| 4 | 25 | $C = 3, K = 5, 1 < N \le 1000$ |
输入格式
随附的样例评测程序按以下格式读取输入:
- 第 1 行:$C \ K \ N$
- 第 2 行:$X$
- 第 3 行:$I[0] \ I[1] \dots \ I[C - 1]$
输出格式
样例评测程序将输出 decode 函数的返回值。