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