1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include<bits/stdc++.h> using namespace std; const int maxn = 105; int pre[maxn], in[maxn], post[maxn], lch[maxn], rch[maxn], val[maxn], n;
int build(int L1, int R1, int L2, int R2, int dep) { if(L1 > R1) return 0; int root = pre[L1]; int p = L2; while(in[p] != root) p++; int cnt = p - L2; lch[root] = build(L1 + 1, L1 + cnt, L2, p - 1, dep + 1); rch[root] = build(L1 + cnt + 1, R1, p + 1, R2, dep + 1); val[root] = dep; return root; }
int dfs(int u) { if(!u) return 0; if(!lch[u] && !rch[u]) return val[u]; if(lch[u] && rch[u]) return dfs(lch[u]) ^ dfs(rch[u]); return dfs(lch[u] ? lch[u] : rch[u]) * 2; }
int main() { cin >> n; for(int i = 1; i <= n; i++) cin >> pre[i]; for(int i = 1; i <= n; i++) cin >> in[i]; int root = build(1, n, 1, n, 0); cout << dfs(root) << endl; return 0; }
|