CFCF2168A2.Encode and Decode (Hard Version)

普及-

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

这是本题的高难度版本。不同之处在于本版本中 ai109a_i \leq 10^9

这是一道运行两次(通信)题。在这类题目中,你的程序会运行两次。两次运行间,存储在内存中的所有变量都会丢失,但在第一次运行中给你的信息,可能对你正确解决第二次运行至关重要。因此,主要的挑战在于采用一定策略,在两次运行间利用你能输出的有限内容进行信息传递。

时间限制和内存限制在两次运行之间不会共享。例如,在本题中,因为时间限制为 22 秒,你只会在任一轮运行超时才会得到 TLE 判定,但如果两次你的程序各耗时 1.51.5 秒,也是没有问题的。

在本题中,你需要找到一种策略,对一个大小为 nn 的数组 aa 进行编码和解码。

第一次运行为编码阶段。你将获得 nnaa 的元素,由评测机给出。你的任务是将这个数组编码为仅包含小写英文字母的字符串 ss,并将 ss 返回给评测机。然后你的程序终止,内存中所有变量都会丢失。

第二次运行为解码阶段。你将获得由评测机给出的字符串 ss(与第一次输出的字符串相同),你的任务是对 ss 进行解码,还原原本的 nn 以及数组 aa。也就是说,你需要逆转第一次的编码算法。

第一次运行

你的代码将在每个测试点上正好运行两次。第一次运行时,你需要进行编码操作。

输入格式

第一行输入字符串 first。此行用于让你的程序识别这是第一次运行,应作为编码算法处理。

第二行输入一个整数 nn,表示 aa 的长度,满足 1n1041 \le n \le 10^4

第三行输入 nn 个用空格分隔的整数 a1,a2,,ana_1, a_2, \ldots, a_n,其中 1ai1091 \le a_i \le 10^9

输出格式

准备好传递字符串 ss 后,请按如下输出:

  • ss,即编码后的字符串(1s1051 \le |s| \le 10^5,其中 s|s| 表示 ss 的长度)。该字符串应仅包含英文小写字母,且中间不包含空格。

输出完毕后,程序应立即终止。请注意,所有内存变量都将在两次运行之间丢失。

第二次运行

在第二次运行时,你需要执行解码操作。

输入格式

第一行输入字符串 second。用于让你的程序识别这是第二次运行,应作为解码算法处理。

第二行输入字符串 ss,即你在第一次运行中传递给评测机的字符串变量。

输出格式

还原原始的 nn 和数组 aa 后,请按如下格式输出:

  • n a1 a2  ann\ a_1\ a_2\ \ldots\ a_n,即原始数组的长度以及所有数组元素。

输入输出样例

  • 输入#1

    first
    5
    100 200 300 400 500

    输出#1

    skibidi

说明/提示

两个示例用于演示同一测试点的两次运行。

第一次运行时,评测机给出 n=5n = 5a=[100,200,300,400,500]a = [100, 200, 300, 400, 500]。读取输入后,你通过自己的编码算法决定编码字符串 ss 为 skibidi。输出 ss 给评测机,程序终止,所有存储在内存中的内容都将丢失,进入第二次运行。

第二次运行时,评测机给出 s=skibidis = \mathtt{skibidi}。读取输入后,你使用自己的解码算法,成功还原出原来的 n=5n = 5a=[100,200,300,400,500]a = [100, 200, 300, 400, 500]。你将其输出,评测机会检查其是否与最初数据一致。若一致,则此测试通过。

这些示例未必展示了最优的编码解码算法。

首页