P1827 [USACO3.4]美國血統 American Heritage
阿新 • • 發佈:2020-10-22
重建二叉樹題
存樹
// ABEDFCHG // CBADEFGH #include<iostream> using namespace std; const int N = 100010; struct Node{ char val; int l, r; }tr[N]; int st[N]; string a, b; int dfs(int u, int l1, int r1, int l2, int r2){ if(l1 > r1) return 0; tr[u].val = b[l2]; int idx = st[b[l2] - 'A']; tr[u].l = dfs(u << 1, l1, idx - 1, l2 + 1, l2 + idx - l1); tr[u].r = dfs(u << 1 | 1, idx + 1, r1, l2 + idx - l1 + 1, r2); return u; } void print(int u){ if(tr[u].l) print(tr[u].l); if(tr[u].r) print(tr[u].r); cout << tr[u].val; } int main(){ cin >> a >> b; for(int i = 0; i < a.size(); i ++) st[a[i] - 'A'] = i; print(dfs(1, 0, a.size() - 1, 0, b.size() - 1)); }
不存樹
#include<iostream> using namespace std; const int N = 30; int st[N]; string a, b; void dfs(int l1, int r1, int l2, int r2){ if(l1 > r1) return; int idx = st[b[l2] - 'A']; dfs(l1, idx - 1, l2 + 1, l2 + idx - l1); dfs(idx + 1, r1, l2 + idx - l1 + 1, r2); cout << b[l2]; } int main(){ cin >> a >> b; for(int i = 0; i < a.size(); i ++) st[a[i] - 'A'] = i; dfs(0, a.size() - 1, 0, b.size() - 1); return 0; }