P2395题解

· · 题解

题目传送门、题解传送门。

大模拟好啊!

大意:

将所需转换的 BBCode 转化成 Markdown。

思路:

所需转换的大约就这几个:

可以看到,需要转化的东西并不是很多,也就是说,几个判断就能搞定。

但是真的是这样吗?

题目已经说了:

为保证评测顺利不被误判,请注意下列要求:

尊重原输入输出的换行,不自行添删。

对于第一条的例外是, 遇到[quote]标签不在新的一行时,Markdown中请另起一行。另外[quote]标签中的代码段头尾空行请去除,不会出现空白的quote。

请注意上表中的空格。

对于不合法的BBCode输入,你的程序必须报错:对于匹配错误的标签输出Match Error,对于未闭合的标签输出Unclosed Mark,请参考样例。两种情况同时出现的时候(即同时有匹配错误和未闭合的标签时),按照匹配错误处理,输出Match Error。由于quote标签的特殊性,为保证不出现歧义,数据保证quote标签不会出现错误。(对于出现如[i][h1]Text[/i]这样的情况,按照Match Error处理,对于[i][h1]Text[/h1]这样的情况,按照Unclosed Mark处理)

由于洛谷限制,请大家在输出Unclosed Mark的时候在close中间切开分为两段字符串输出,否则会被吞记录。

保证以下三种字符不出现在除quote标签包裹的段落中的文字中:[,],/,*,_,#,>,但地址中可能会出现/字符。

保证输入不会出现标签不完整的情况,例如[h1]Text[/h

对于曾经在其他地方使用过Markdown与BBCode的同学:题中的格式不是严格的BBCode与Markdown格式,请勿被经验迷惑。

也就是说,我们需要一个栈来储存,每次形如 P1499 后缀表达式 一样,如果遇到 BBCode,则将代码压入栈,并将所表示的 flag 标记为 true,在下一次遇到第二个所需要转换的表示相同意义的 BBCode 时,将两个 BBCode 转化为Markdown,并且将 flag 标记为 false即可。

但是注意,如果最后的时候 flag 仍为 true,则需要输出 Match Error,对于 [i][h1]Text[/h1] 这样的情况,需要输出 Unclosed Mark

urlimg 需要特殊处理一下。

END。