1. 程式人生 > 實用技巧 >洛谷-P1827 [USACO3.4]美國血統 American Heritage

洛谷-P1827 [USACO3.4]美國血統 American Heritage

洛谷-P1827 [USACO3.4]美國血統 American Heritage

原題連結:https://www.luogu.com.cn/problem/P1827


題目描述

農夫約翰非常認真地對待他的奶牛們的血統。然而他不是一個真正優秀的記帳員。他把他的奶牛 們的家譜作成二叉樹,並且把二叉樹以更線性的“樹的中序遍歷”和“樹的前序遍歷”的符號加以記錄而 不是用圖形的方法。

你的任務是在被給予奶牛家譜的“樹中序遍歷”和“樹前序遍歷”的符號後,建立奶牛家譜的“樹的 後序遍歷”的符號。每一頭奶牛的姓名被譯為一個唯一的字母。(你可能已經知道你可以在知道樹的兩 種遍歷以後可以經常地重建這棵樹。)顯然,這裡的樹不會有多於 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;
}