P1827 [USACO3.4] 美国血统 American Heritage
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
string in, pre;
string dfs(int idx, int l, int r)
{
//递归结束条件
if(l > r) return "";
//找到以idx为根的中序遍历下标,然后将中序遍历分割成左右子树
int i = l;
while(i < r && in[i] != pre[idx]) i ++;
string post = "";
//左子树根节点idx + 1,l, i - 1中序遍历端点
post += dfs(idx + 1, l, i - 1);
//右子树根节点为idx + i - l + 1, i + 1, r 中序遍历端点
post += dfs(idx + (i - l) + 1, i + 1, r);
//将根节点加入字符串,相当于树的后续遍历架构
post += pre[idx];
return post;
}
int main()
{
cin >> in >> pre;
//根节点在前序中的下标,中序序列的左右端点
cout << dfs(0, 0, in.size() - 1) << endl;
return 0;
}