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 的程式碼。為此,她作出了以下正確假設:
每個輸出程序中的輸出敘述都位於正確的位置(例如,
inPrint程序中位於兩次遞迴呼叫之間)。三個程序共有六次遞迴呼叫,其中恰好兩次呼叫
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