洛谷-P1827 [USACO3.4]美國血統 American Heritage
阿新 • • 發佈:2020-12-23
洛谷-P1827 [USACO3.4]美國血統 American Heritage
題目描述
農夫約翰非常認真地對待他的奶牛們的血統。然而他不是一個真正優秀的記帳員。他把他的奶牛 們的家譜作成二叉樹,並且把二叉樹以更線性的“樹的中序遍歷”和“樹的前序遍歷”的符號加以記錄而 不是用圖形的方法。
你的任務是在被給予奶牛家譜的“樹中序遍歷”和“樹前序遍歷”的符號後,建立奶牛家譜的“樹的 後序遍歷”的符號。每一頭奶牛的姓名被譯為一個唯一的字母。(你可能已經知道你可以在知道樹的兩 種遍歷以後可以經常地重建這棵樹。)顯然,這裡的樹不會有多於 26 個的頂點。 這是在樣例輸入和 樣例輸出中的樹的圖形表達方式:
C
/ \
/ \
B G
/ \ /
A D H
/ \
E F
樹的中序遍歷是按照左子樹,根,右子樹的順序訪問節點。
樹的前序遍歷是按照根,左子樹,右子樹的順序訪問節點。
樹的後序遍歷是按照左子樹,右子樹,根的順序訪問節點。
輸入格式
第一行: 樹的中序遍歷
第二行: 同樣的樹的前序遍歷
輸出格式
單獨的一行表示該樹的後序遍歷。
輸入輸出樣例
輸入 #1
ABEDFCHG
CBADEFGH
輸出 #1
AEFDBHGC
說明/提示
題目翻譯來自NOCOW。
USACO Training Section 3.4
C++程式碼
#include <iostream> #include <cstring> using namespace std; string a, b; void dfs(int as, int ae, int bs, int be) { if (as > ae || bs > be) return ; for (int i=as; i<=ae; ++i) if (a[i] == b[bs]) { dfs(as, i-1, bs+1, bs+i-as); dfs(i+1, ae, bs+i-as+1, be); cout << a[i]; } } int main() { cin >> a >> b; int l = a.size(); dfs(0, l-1, 0, l-1); cout << endl; return 0; }