QOJ.ac

QOJ

时间限制: 6 s 内存限制: 2048 MB 总分: 100

#8862. 爬树

统计

Anatoly Cheng McDougal 在很多方面都是一个典型的学生。只要有可能,他就会尝试剪切和粘贴代码,而不是从头开始编写。不可避免地,这种方法给他带来了麻烦。例如,当他第一次学习树的先序(preorder)、中序(inorder)和后序(postorder)遍历,并得到一段树的先序打印代码(如下左侧所示)时,他只是简单地剪切并粘贴了代码,然后将打印语句移动到正确的位置并重命名了过程。然而,他忘记重命名代码内部的过程调用,导致了如下所示的错误的先序、中序和后序打印代码。

void prePrint(TNode t)
{
output(t.value);
if (t.left != null)
prePrint(t.left);
if (t.right != null)
prePrint(t.right);
}
void inPrint(TNode t)
{
if (t.left != null)
prePrint(t.left);
output(t.value);
if (t.right != null)
prePrint(t.right);
}
void postPrint(TNode t)
{
if (t.left != null)
prePrint(t.left);
if (t.right != null)
prePrint(t.right);
output(t.value);
}

此时,Anatoly 的表现不像一个典型的学生。他实际上测试了他的代码!不幸的是,当结果不正确时,他又回到了典型的学生行为。他惊慌失措,开始随机更改所有三个过程中的调用,希望能把事情搞定。不用说,情况比他开始时更糟了。

Anatoly 的教授在一棵随机的字符树上测试了这段代码。当她查看他三个打印程序的输出时,她正确地猜到了发生了什么。然而,她没有直接去看他的代码,而是决定仅通过观察输出来尝试重构 Anatoly 的代码。为了做到这一点,她正确地做出了以下假设:

  1. 每个打印程序中的输出语句都在正确的位置(例如,在 inPrint 程序的两个递归调用之间)。
  2. 在这三个程序所做的六个递归调用中,恰好有两个调用是 prePrint,恰好有两个是 inPrint,恰好有两个是 postPrint,尽管可能在错误的程序中。

教授很快意识到,从输出中重构 Anatoly 的代码和测试树并非易事,而且结果可能是模棱两可的。你将不得不帮助她找到所有可能的 Anatoly 代码重构方案。此外,对于每种这样的重构,你需要找到产生观察到的输出的字典序最小的树(如输出部分所述)。

输入格式

输入包含单个测试用例。测试用例由三行上的三个字符串组成:Anatoly 的 prePrintinPrintpostPrint 程序在某棵测试树上的观察输出(按此顺序)。每个字符串由 $n$ 个大写字母组成($4 \le n \le 26$),且任何字符串中都没有重复的字母。保证测试用例至少有一个解。

输出格式

显示测试用例的所有可能重构,并按最后一段所述的顺序排列。每个重构的输出由两部分组成。第一部分是一行,描述 Anatoly 程序中的六个调用:首先是 Anatoly 的 prePrint 程序中的两个(递归)调用,接着是他 inPrint 程序中的调用,最后是他 postPrint 程序中的调用。这些调用由单词 PreInPost 描述,并用空格分隔。例如,如果 Anatoly 的程序是正确的,则重构第一部分的输出结果将是 Pre Pre In In Post Post

第二部分由三行组成,描述了可能产生观察到的输出的第一棵测试树。第一行是该树正确的先序打印,第二行和第三行分别是正确的中序和后序打印。第一棵树是指先序打印字典序最小的那棵树。如果存在多棵这样的树,则其中第一棵是中序打印字典序最小的那棵。

每个重构都是从 PreInPost 中选择的 6 个标记序列。重构的顺序是关于以下标记顺序的字典序:Pre < In < Post

样例

样例输入 1

HFBIGEDCJA
BIGEDCJFAH
BIGEDCJFAH

样例输出 1

Pre Post In Post In Pre
HFBJCDEGIA
BIGEDCJFAH
IGEDCJBAFH

样例输入 2

BNLFAGHPEDOCMJIK
NLBGAPHCODEIJMKF
NLFAGHPEDOCMJIKB

样例输出 2

In Pre In Post Post Pre
BLNFKMEHAGPCODIJ
NLBAGHPEODCMIJKF
NLGAPHDOCEJIMKFB
Post Pre In In Post Pre
BLNFKICPGAHEODMJ
NLBGAPHCODEIJMKF
NLAGHPDOECJMIKFB

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.