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

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

重建二叉樹題

存樹

// 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;
}