QOJ.ac

QOJ

実行時間制限: 2 s メモリ制限: 2048 MB 満点: 100

#2231. 音调库

統計

在火星上,地球有史以来最伟大的音乐金曲都存储在巨大的物理数据库中。这使得当前和未来的火星居民在思乡时,能够重温母星的文化。这些数据库被称为“音库”(Tone Banks),因为它们以音符为单位存储歌曲。

然而,就在最近,人们发现记录的数据格式在长期暴露于宇宙辐射下时可能会退化。因此,需要将记录从当前使用的格式快速转换为新格式。

当前的数据格式由数据点的二维网格组成。每个数据点有两种类型之一,即“#”或“.”(类似于地球上的 1 和 0)。这两种数据点类型互为补集。如果两个数据点在网格中共享一条边,则称它们是相邻的。这意味着坐标为 $(X, Y)$ 的数据点(即第 $X$ 行第 $Y$ 列)与坐标为 $(X+1, Y)$、$(X-1, Y)$、$(X, Y+1)$ 和 $(X, Y-1)$ 的数据点相邻(在网格范围内)。

数据点形成了所谓的“数据块”(Data Blobs),即由特定类型的数据点组成的连通区域。这意味着数据块中的每个数据点都可以通过一系列相邻的同类型数据点到达该数据块中的任何其他数据点。

此外,在数据块的连通区域内,可能存在由互补数据点类型组成的其它数据块。这种包含关系可以无限重复,交替变换数据点类型,直到某个数据块不再包含任何其它数据块为止。对于一个数据块,我们将位于其区域内且与该数据块至少一个数据点相邻的数据块称为“内部数据块”。每个数据块可以包含 0 到 26 个内部数据块。一个数据块所包含的内部数据块的数量决定了它所编码的音符(用英文字符表示,1 个内部数据块 = a,2 个内部数据块 = b,...,26 个内部数据块 = z)。不包含任何其它数据块的数据块不代表任何音符/字符;它代表空字符串。一个数据块必须将其内部数据块完全包含在自身内部。这意味着其内部数据块的每个数据点 $(X, Y)$ 都不能与其(可能是假设的)外部数据块(即包含它的数据块)的同类型数据点相邻。这些点不仅不能根据上述定义相邻,而且即使在对角线上也不能与点 $(X+1, Y+1)$、$(X+1, Y-1)$、$(X-1, Y+1)$ 和 $(X-1, Y-1)$ 相邻。注意,单个数据块的不同内部数据块可以在对角线上相邻。参见下方的示例图片。

3 个正确的内部“.”数据块

错误的内部“#”数据块

每首存储的歌曲都由一系列音符组成,因此可以用由英文字母组成的单词来表示。歌曲通过以下算法从记录中解码。为简单起见,我们认为在网格边界之外存在一个类型为“.”的无限大数据块。在这个数据块中,始终存在一个类型为“#”的单一数据块。我们从解码这个数据块开始。由一个数据块表示的单词是代表该数据块的字母与该数据块内包含的所有内部数据块所代表的单词的拼接。拼接过程按照内部数据块数据点的坐标进行字典序排列。也就是说,对于两个数据块,我们首先将代表该数据块的单词与行号最小的数据点拼接;如果行号相同,则与列号最小的数据点拼接。

新数据格式遵循完全相同的规则,只是它编码的是旧格式所编码单词的逆序。你能安全地将所有歌曲转换为新格式吗?

输入格式

输入包含两个整数 $N$ 和 $M$ ($1 \le N, M \le 100$),分别表示旧数据格式网格的行数和列数。接下来是 $N$ 行,每行包含 $M$ 个字符,字符类型为“#”或“.”。该网格根据上述格式编码了一个非空单词。

输出格式

输出两个整数 $K$ 和 $L$ ($1 \le K, L \le 3000$),分别表示新数据格式网格的行数和列数。之后,输出 $K$ 行,每行包含 $L$ 个字符,字符类型为“#”或“.”。该网格必须编码输入所编码单词的逆序。

样例

样例输入 1

7 7
#######
#.....#
#.....#
#.....#
#.....#
#.....#
#######

样例输出 1

3 3
###
#.#
###

说明:第一个样例输入编码单词“a”,因此答案也编码单词“a”。

样例输入 2

8 29
#############################
#...##........##............#
#.#.##.#..##..##.####...###.#
#.#.##....##..##.####...#.#.#
#...##........##........###.#
#######################.....#
######.................######
#############################

样例输出 2

14 33
#################################
#################################
#####......................######
#####.################.###.######
#####.#...#######..###.#.#.######
#####.#...#####....###.###.######
#####.#.######..#..###.#.#.######
#####.########.....###.###.######
#####........#########.#.#.######
#####..................###.######
#####..................#.#.######
#####..................###.######
###########................######
#################################

说明:第二个样例输入编码单词“dabba”,因此答案编码单词“abbad”。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.