luogu#P11530. [THUPC2025 初赛] 峰回路转
[THUPC2025 初赛] 峰回路转
题目背景
昼短夜长冬至近。江冽漆黑,但见东云粉。窗外惺忪鸥鹭阵,室中香漫晨炊奋。
朝肄暮劳催彼盹。宵寂观书,灯烬方安寝。请替君劳分重任,逍遥共舞生辰顺。
题目描述
K 最近在学古诗文。古诗文的行文不一定按照现代人的习惯,有时是因为古诗文有其特殊的语法结构,有时是因为对仗工整、韵律和谐等主观原因。但是,如果直接在原文旁边标注一个表示正确阅读顺序的排列,不仅在排版上不美观,而且寻找下一个编号也比较麻烦。为了方便阅读,K 设计了一套辅助记号来标注顺序,替代直接标注顺序编号的方式。
辅助记号一共有 3 种:近邻逆接记号、近邻顺接记号、遥远跳转记号。两种近邻记号定义了相邻两个字符之间相对的阅读顺序,故其必须出现在相邻两个字符之间,而不能出现在句首或句末;遥远跳转记号在单独使用时仅作用于其前一个字符,故其必须出现在单个字符之后,可以出现在句末而不能出现在句首。
近邻逆接记号 *
用于表示,在正常阅读顺序中,该记号前的最后一个字符应该紧跟在该记号后的第一个字符之后,如“研表*
究明,汉字序*
顺并不定*
一影阅*
响读”的正确语序是“研究表明,汉字顺序并不一定影响阅读”。近邻逆接记号可以连续使用,此时表示对应的一整段文字应从后往前逐个阅读。如“林暗草惊风,将军夜引弓”的正常语序是“林暗风惊草,将军夜引弓”,所以可以用“林暗草*
惊*
风”来标记主宾换位。
对于较复杂的阅读顺序,可以用遥远跳转记号来辅助理解。例如,“马之千里者,一食或尽粟一石”中,“一石”是修饰“粟”的数量短语,因此按正常语序应为“一食或尽一石粟”。为了标注此类不相邻的顺序交换,可以使用遥远跳转记号来指出需要从后往前依次阅读的一组字符,并称这样的一组字符为遥远跳转结构。为了防止出现混乱,规定对于任意两组遥远跳转结构,要么其中一组的所有字符都在另一组的任意字符之前,要么其中一组的所有字符都位于另一组中连续的某两个字符之间;不允许两组遥远跳转结构的字符在原字符串中交叉出现。因为可能出现多层嵌套,所以遥远跳转记号具有 p-q
的形式,其中正整数 p
表示内部嵌套的层数,q
表示在该组中的顺序。如果一组遥远跳转结构内部没有嵌套任何其它遥远跳转结构,则该组遥远跳转结构的各记号的层数 p
均为 ,否则为内部嵌套的所有遥远跳转结构的最大层数 。对于同一组遥远跳转结构,按各字符在原字符串中的出现顺序从后往前依次编号 q
,这一顺序也即实际阅读顺序。在阅读带有辅助记号的文本时,如果一个字符后紧跟着序号 q
的遥远跳转记号,则应暂时跳过该字符不读;直到遇到 q
恰好为 的遥远跳转记号,此时应从后往前依次阅读同组的 p-1
,p-2
等记号前的单个字符,直到遇到层数 p
更大的遥远跳转记号、另一个层数相同的 p-1
的遥远跳转记号(此时这一记号应标记另一组遥远跳转结构),或者碰到开头。
对于上文中取自《马说》的例句,相应的标注方法为“一食或尽粟1-2
一石1-1
”。再例如,“入则无法家拂士,出则无敌国外患者,国恒亡,然后知生于忧患而死于安乐也”一句中出现了两处状语后置(“然后知于忧患生而于安乐死也”),其满足要求的标注方法为“然后知生1-2
于忧患1-1
而死1-2
于安乐1-1
也”。另外,同一组的遥远跳转记号的序号 q
一定是降序出现的,即不允许连续出现 p-2 p-3 p-1
等情况。
由于近邻逆接记号和遥远跳转记号都可以用来表示与正常阅读方向相反的跳转,规定在读完一个字符后需要紧接着阅读其前一个字符时,必须使用近邻逆接记号。这一规定会产生一个问题,即在同一组遥远跳转结构中出现了在原文中相邻的字符时,如果相邻的字符不在遥远跳转结构的开头或结尾,用近邻逆接记号来标注这一堆字符,有可能会导致阅读顺序的歧义。幸好,解决办法并不复杂:只需在出现相邻字符的位置将一个遥远跳转结构拆成两个或多个即可。注意拆开时,每个新的结构的所对应的层数应独立计算。
在使用遥远跳转记号时,默认只更改记号前的单个字符的阅读顺序。如果需要将连续的多个字符的阅读顺序推后,则应配合近邻顺接记号 #
,表示该记号后的第一个字符应该紧跟在该记号前的最后一个字符之后。例如,“今日大风寒,寒风摧树木,严霜结庭兰”一句中,主语“庭兰”和宾语“严霜”的位置发生了对调,故可以标注为“严1-3#
霜结1-2
庭兰1-1
”。出于简洁起见,要求近邻顺接记号必须和序号 q
的遥远跳转记号连用,但根据实际需要可以连续使用多个近邻顺接记号,此时在且仅在第一个近邻顺接记号前标注遥远跳转记号。例如,“七八个星天外,两三点雨山前”的正常语序是“天外七八个星,山前两三点雨”,因此可以标注为“七1-2#
八#
个#
星天外1-1
,两1-2#
三#
点#
雨山前1-1
”。
在阅读标注有辅助记号的文本时,默认按照正常阅读顺序从前往后处理每个字符。如果遇到一个字符没有标注辅助记号且其前一个字符没有标记近邻顺接记号,应该直接阅读这个字符;否则,先暂时忽略该字符。当遇到标注有序号为 的遥远跳转记号的字符(对应忽略了同组的遥远跳转记号及任何相关的近邻顺接记号)或没有标注辅助记号的字符(对应忽略了至少一个近邻逆接记号)时,先阅读这个字符,再按相应规则返回阅读被忽略的字符。
为了防止使用记号时出现歧义,除了上述规则外,还规定:
- 相邻两个字符之间,要么不使用任何辅助记号,要么使用单独的近邻逆接记号,单独的近邻顺接记号,单独的遥远跳转记号,一个遥远跳转记号和一个近邻逆接记号,或一个遥远跳转记号和一个近邻顺接记号。最后一个字符之后要么没有辅助记号,要么有单独的遥远跳转记号。
- 如果相邻两个字符之间使用了一个遥远跳转记号和任意一种近邻记号的组合,则应将遥远跳转记号标在近邻记号之前。特别地,如果是一个遥远跳转记号和一个近邻逆接记号的组合,则该遥远跳转记号的序号
q
必须为 。 - 对于任意连续的三个字符,不允许混合使用近邻逆接记号和近邻顺接记号(无论是否与遥远跳转记号搭配使用),即不能出现
.#.*.
或.*.#.
等未定义的标注方式,其中.
表示单个需要被标注的字符。同理,不允许出现前一个字符标注了近邻顺接记号,后一个字符标注了遥远跳转记号(无论这个遥远跳转记号是否与任意近邻记号组合使用)。
不过,K 发现这套系统并不能标记任意的排列。例如,“绿垂风折笋,红绽雨肥梅”在现代汉语中的语序是“风折绿笋垂,雨肥红梅绽”,它就无法被任意记号的组合表示。因此 K 想知道,对于给定的一个阅读顺序,是否存在一种仅使用上述三种记号的标注方法。如果存在,请帮 K 求出满足简洁要求的唯一标注方法。
输入格式
输入的第一行包含一个正整数 ,表示需要标注的原字符串长度。保证 。
输入的第二行包含 个正整数 ,其中 表示需要标注的原字符串的第 个字符在正确阅读顺序中的位置。保证 是一个 的排列。
输出格式
输出一个字符串。
如果存在合法的标注方法,则输出满足要求的唯一标注方法,其中用单个 .
表示原字符串中的每个字符。
否则,输出 -1
,表示不存在合法的标注方法。
4
1 3 2 4
..*..
9
3 4 1 2 8 9 5 6 7
.1-2#...1-1.1-2#....1-1
4
2 4 1 3
-1
7
7 1 2 6 5 3 4
.1-2...1-1*.1-2..1-1
8
1 2 8 6 3 5 4 7
...2-2.1-2..1-1*..2-1
8
2 1 3 8 7 5 4 6
.*...*.1-2.*..1-1
提示
样例解释
-
样例 1:“微斯人,吾谁
*
与归?” -
样例 2:“故
1-2#
国神游1-1
,多1-2#
情应笑我1-1
。” -
样例 3: 另外三种不能被表示出来的长度为 的阅读顺序为:
- ;
- ;
- 。
题目来源
题目来自 THUPC2025(2025年清华大学学生程序设计竞赛暨高校邀请赛)初赛,信息来源于 THUSAAC 仓库。