QOJ.ac

QOJ

Time Limit: 6 s Memory Limit: 2048 MB Total points: 100

#8862. 樹上困局

Statistics

Anatoly Cheng McDougal 在許多方面都是個典型的學生。只要有可能,他就會複製貼上程式碼,而不從頭撰寫。這種做法難免會帶來問題。例如,他剛學到樹的前序、中序和後序走訪,並拿到樹的前序輸出程式碼(如下方左側所示)時,只是複製貼上程式碼,把輸出敘述移到正確位置,再替程序改名。然而,他忘記修改程式碼內部呼叫的程序名稱,因此產生了下方有缺陷的中序和後序輸出程式碼。

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 的 prePrint、inPrint 和 postPrint 程序(依此順序)在某棵測試樹上產生的觀察輸出。每個字串由 $n$ 個大寫字母組成($4 \le n \le 26$),且任何一個字串內都沒有重複字母。保證測試資料至少有一個解。

輸出格式

輸出這筆測試資料所有可能的重建方式,順序依照下方最後一段的說明。每種重建方式的輸出分成兩部分。第一部分只有一行,描述 Anatoly 程序中的六次呼叫:先是 prePrint 程序中的兩次(遞迴)呼叫,接著是 inPrint 程序中的呼叫,最後是 postPrint 程序中的呼叫。以 Pre、In 和 Post 這些單字表示呼叫,並以空格分隔。例如,若 Anatoly 的程序正確,重建方式的第一部分就會輸出 Pre Pre In In Post Post。

第二部分有三行,描述能產生觀察輸出的第一棵測試樹。第一行是該樹正確的前序輸出,第二行和第三行分別是正確的中序和後序輸出。第一棵樹指前序輸出按字母順序最小的樹。若有多棵這樣的樹,則選其中中序輸出按字母順序最小的樹。

每種重建方式都是從 Pre、In 和 Post 中選取的 6 個詞元構成的序列。重建方式按照字典序排列,詞元的順序為 $\texttt{Pre} < \texttt{In} < \texttt{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.