#icpc2012autumng. [icpc2012autumn_g]Ancient Commemorative Monolith
[icpc2012autumn_g]Ancient Commemorative Monolith
题目描述
在森林中的一天,爱丽丝发现了一个古老的石碑。
她调查了石碑,并发现上面写着一句用古老语言写成的句子。句子由字形和围绕它们的矩形构成。对于上面的例子,有以下字形。
注意,句子中的一些字形是水平翻转的。
她决定使用ASCII字母对其进行音译,将每个字形分配一个字母,并将[
和]
分配给矩形。如果一个句子包含一个翻转的字形,她会从右到左进行音译。例如,她可以分别为上述字形分配a
和b
。那么上面的句子将被音译为[[ab][ab]a]
。
检查完句子后,爱丽丝得出结论,该句子按以下结构进行组织:
- 句子是由零个或多个组成的序列。
- 可以是一个字形或一个。一个字形可以被翻转。
- 是一个围绕的矩形。盒子的高度大于盒子内的任何字形。
现在,石碑上写的句子是一个非空的。序列中的每个项都适配在一个矩形边界框中,尽管未明确指定字形的边界框。相邻项的边界框之间没有重叠。爱丽丝将音译规则形式化如下。
设为音译函数。
每个序列可以从左到右或者从右到左进行书写。但是,请注意这里对应于句子中最左边的项,对应于第二个左边的项,依此类推。
令为翻转的字形。当一个序列包含一个或多个单字形项,其需要翻转才能识读时,即存在一个整数,其中是单字形,而不在单独给出的字形字典中,而在其中。在这种情况下,定义为,否则。如果序列中存在一个或多个需要翻转才能识读的字形,则保证序列中的所有字形都被翻转。
如果项是一个围绕序列的盒子,则 [
]
。如果项是字形,则映射到与字形对应的字母,如果包含字形的序列是从右到左书写的,则映射到。
请编写一个程序,将石碑上的句子音译,以帮助爱丽丝。
输入
输入由多个数据集组成,以两个由单个空格分隔的零表示结尾。
每个数据集的格式如下。
... ...
()是字形的数量, ()是石碑的数量。字形按以下格式给出。
... ... ...
是爱丽丝为字形分配的小写字母。和 (,)指定字形的位图的高度和宽度。矩阵表示位图。白色单元格用.
表示,黑色单元格用*
表示。
可以假设所有的字形都分配了不同的字符。可以假设位图的每一列至少包含一个黑色单元格,并且位图的第一行和最后一行至少包含一个黑色单元格。每个位图互不相同,但可能存在一个翻转的位图与另一个位图相同。此外,可能存在对称位图。
按以下格式给出。
... ... ...
和 (,)是序列的位图的高度和宽度。与字形字典类似,表示位图,其中白色单元格用.
表示,黑色单元格用*
表示。
没有噪声:位图中的每个黑色单元格都属于一个字形或一个矩形盒子。矩形的高度至少为3,大于最高字形的高度。矩形的宽度至少为3。
一个矩形必须在其边缘周围有1像素的空白。
可以假设字形永远不会垂直排列。此外,可以假设如果两个矩形或一个矩形和一个字形在同一列,那么其中一个包含另一个。对于字形的边界框和矩形的黑色单元格,每两个之间至少有一个白色单元格。可以假设位图中至少有一个黑色单元格。
输出
对于每个石碑,在一行中输出音译后的句子。在输出一个数据集后,在一行中输出#
。