• USACO 3.4 American Heritage


    American Heritage

    Farmer John takes the heritage of his cows very seriously. He is not, however, a truly fine bookkeeper. He keeps his cow genealogies as binary trees and, instead of writing them in graphic form, he records them in the more linear `tree in-order' and `tree pre-order' notations.

    Your job is to create the `tree post-order' notation of a cow's heritage after being given the in-order and pre-order notations. Each cow name is encoded as a unique letter. (You may already know that you can frequently reconstruct a tree from any two of the ordered traversals.) Obviously, the trees will have no more than 26 nodes.

    Here is a graphical representation of the tree used in the sample input and output:

                      C
                    /   
                   /     
                  B       G
                 /      /
                A   D   H
                   / 
                  E   F
    

    The in-order traversal of this tree prints the left sub-tree, the root, and the right sub-tree.

    The pre-order traversal of this tree prints the root, the left sub-tree, and the right sub-tree.

    The post-order traversal of this tree print the left sub-tree, the right sub-tree, and the root.

    PROGRAM NAME: heritage

    INPUT FORMAT

    Line 1: The in-order representation of a tree.
    Line 2: The pre-order representation of that same tree.

    SAMPLE INPUT (file heritage.in)

    ABEDFCHG
    CBADEFGH
    

    OUTPUT FORMAT

    A single line with the post-order representation of the tree.

    SAMPLE OUTPUT (file heritage.out)

    AEFDBHGC 

    —————————————————————
    用前序遍历中某个字母的位置可以得到它的左子树的长度
    然后就可以了
    存代码
     1 /*
     2 ID: ivorysi
     3 PROG: heritage
     4 LANG: C++
     5 */
     6 #include <iostream>
     7 #include <cstdio>
     8 #include <cstring>
     9 #include <algorithm>
    10 #include <queue>
    11 #include <set>
    12 #include <vector>
    13 #include <string.h>
    14 #define siji(i,x,y) for(int i=(x);i<=(y);++i)
    15 #define gongzi(j,x,y) for(int j=(x);j>=(y);--j)
    16 #define xiaosiji(i,x,y) for(int i=(x);i<(y);++i)
    17 #define sigongzi(j,x,y) for(int j=(x);j>(y);--j)
    18 #define inf 0x3f3f3f3f
    19 #define MAXN 400005
    20 #define ivorysi
    21 #define mo 97797977
    22 #define ha 974711
    23 #define ba 47
    24 #define fi first
    25 #define se second
    26 #define pii pair<int,int>
    27 using namespace std;
    28 typedef long long ll;
    29 int id[30];
    30 int root,lson[30],rson[30],fa[30];
    31 string str;
    32 int dfs(string s,int fa) {
    33     if(s.length()<1) return 0;
    34     int u=s[0]-'A'+1;
    35     if(s.length()==1) {return u;}
    36     lson[u]=dfs(s.substr(1,id[u]-id[fa]-1),fa);
    37     rson[u]=dfs(s.substr(id[u]-id[fa]),u);
    38     return u;
    39 }
    40 void ans(int u) {
    41     if(u==0) return;
    42     ans(lson[u]);
    43     ans(rson[u]);
    44     printf("%c",u+'A'-1);
    45 }
    46 void init() {
    47     cin>>str;
    48     xiaosiji(i,0,str.length()) {
    49         id[str[i]-'A'+1]=i+1;    
    50     }
    51     cin>>str;
    52     root=str[0]-'A'+1;
    53 }
    54 void solve() {
    55     init();
    56     dfs(str,0);
    57     ans(root);
    58     puts("");
    59 }
    60 int main(int argc, char const *argv[])
    61 {
    62 #ifdef ivorysi
    63     freopen("heritage.in","r",stdin);
    64     freopen("heritage.out","w",stdout);
    65 #else
    66     freopen("f1.in","r",stdin);
    67 #endif
    68     solve();
    69 }
     
  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/ivorysi/p/6242753.html
Copyright © 2020-2023  润新知