#CSP202512C. 图片解码
图片解码
时间限制: 1.5 秒
空间限制: 512 MB
题目背景
西西艾弗岛上的居民经常使用 InkGraph 系统来对自己的图片进行加密操作。加密方在加密图片时,将图片输入该系统后可以得到一份系统文件与一个对应的密钥;如果想要获取图片的原始信息,接收方需要获取该系统文件与对应的密钥并将它们输入系统,经系统解码后便能获得原始图片。
具体来说,一张图片可以由一个 的字符表格 来表示,其中位于从上向下数第 行,从左向右数第 列的字符可以用 ()来表示。这些字符中仅含有大小写字母、数字和下划线。新加入开发团队的小 C 学习了这个系统的加密方法。
加密步骤
加密方在加密一张图片 前,需预先设定一个整数规模参数 ()。在导入图片 后,系统会自动在右下方用字符 ? 将其补齐成一张 的正方形图片 。 一个对 图片加密,并设置 的例子如下:
系统此时会向用户请求加密次数 ,满足 。然后系统会从图片 开始,进行 次加密操作。具体来说,第 次加密操作的输入为 ,输出为 。 次加密操作结束后,系统会将加密后的最终结果图 与代表加密过程的密钥(一个整数序列 )输出到加密方获取的系统文件中。在加密过程开始前,系统先向空的密钥 中添加一个整数 ,即设置 。
对于第 次加密操作,系统会先自动选择一个加密类型 。
如果 ,那么第 次加密是一次旋转加密。系统会生成一个五维整数向量 ,满足 $1\leq u_i\leq Z,1\leq v_i\leq Z,1\leq L_i\leq \min\{Z,10\},u_i+L_i-1\leq Z,v_i+L_i-1\leq Z,d_i\in\{90,180,270\},0\leq r_i\leq 3$,然后抽取出图片 的从第 到第 行,第 到第 列的大小为 的正方形子表 ,将 顺时针旋转 度(角度制)后放在原来的位置上(字符本身不会被旋转);旋转完成后,再对这张图整体进行 次逆时针旋转 度的操作,从而得到本次加密的结果图 。将上例图片作为 进行一次 的旋转加密的过程如下,得到本次加密操作的结果图片 :
在本次加密完成后,系统会在密钥序列 的后方依次追加 这 个数。例如若上述加密过程为第一次加密,密钥序列 应形如 。
如果 ,那么第 次加密是一次翻转加密:系统会生成一个五维整数向量 ,满足 $1\leq u_i\leq d_i\leq Z,1\leq l_i\leq r_i\leq Z,1\leq d_i-u_i+1\leq\min\{Z,10\},1\leq r_i-l_i+1\leq\min\{Z,10\},o_i\in\{-1,1\}$,然后抽取出当前图片 的第 到第 行,第 到第 列的大小为 的矩形子表 ;当 时,将 上下翻转;当 时,将 左右翻转(字符本身不会被翻转),然后放在原来的位置上,从而得到本次加密的结果图 。将上例图片作为 进行一次 的翻转加密的过程如下,得到本次加密的结果图片 :
在本次加密完成后,系统会在密钥序列 的后方依次追加 这 个数。例如若上述加密过程为第一次加密,密钥序列 应形如 。
全部 次加密过程结束后,最终结果图 和密钥 会被输出至系统文件中。
题目描述
小 C 对 InkGraph 系统的解码方法非常感兴趣,想要上手编写这个解码的程序。换句话说,现在他获得了一份系统文件,含有加密的最终结果图 与对应的密钥序列 ,他的程序需要能够还原出加密方导入的原始的图片 。现在,请你帮他完成这个任务。
输入格式
从标准输入读入数据。
输入的第一行是一个正整数 。保证 不小于加密方输入图片的长和宽,也即加密程序能够正常运作;
接下来的 行为最终的结果图片 。保证每行恰有 个字符,且输入的字符仅包含大小写字母、数字、下划线和问号。
接下来输入一行一个正整数 ,表示密钥 的长度;然后下一行输入 个由空格分隔的整数,表示密钥 。
输出格式
输出到标准输出。
第一行输出用空格分隔的两个整数 和 ,表示还原出的图片 的宽度与长度。
接下来输出 行,每行 个字符,仅含有大小写字母、数字和下划线,表示原本的图片。
4
?Nk?
??F?
??C?
C1??
13
2 1 2 2 3 90 1 2 2 3 1 3 -1
2 3
CCF
1Nk
样例 1 解释
样例中系统进行了 次加密,原始图片 如案例所示。第一次加密为旋转加密,过程如案例中所示;第二次加密为翻转加密,其生成的五元向量参数为 。
样例 2
样例 2 解释
该样例中的数据满足 。
样例 3
子任务
本题采用捆绑测试,你只有通过一个子任务中的所有测试点才能得到该子任务的分数。
| 子任务编号 | 分值 | 约束 |
|---|---|---|
| 1 | 25 | 保证 且 |
| 2 | 保证 | |
| 3 | 保证 | |
| 4 | 保证 |