P1827 [USACO3.4]美国血统 American Heritage

重建二叉树题

存树

// ABEDFCHG 
// CBADEFGH 

#include<iostream>
using namespace std;

const int N = 30;

struct Node{
    char val;
    int l, r;
}tr[N];

int st[N];
int cnt;

string a, b;

int dfs(int l1, int r1, int l2, int r2){
    if(l1 > r1) return 0;
    int u = ++ cnt;
    tr[u].val = b[l2];
    int idx = st[b[l2] - 'A'];
    tr[u].l = dfs(l1, idx - 1, l2 + 1, l2 + idx - l1);
    tr[u].r = dfs(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(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;
}
posted @ 2020-10-22 14:27  yys_c  阅读(85)  评论(0编辑  收藏  举报