校选拔赛G题

//给N个操作,有两种操作,下面的A,B均是人名
//birth A B表示A生了个儿子B
//die A表示A死了
//要求前序遍历输出族谱,死了的人不用输出
#include <bits/stdc++.h>
using namespace std;
int flag[10003];    //flag=0 is dead,flag=1 is alive
vector<int>g[10003];//下标是结点编号,对应儿子结点编号
map<string,int>mp;  //名字找结点编号
int tot=1;          //结点总数
string na[10003];   //下标是结点编号,对应该结点字符串
void dfs(int x){                    //对当前结点深搜
    if(flag[x]==1)flag[x]=0,cout<<na[x]<<endl;//如果生存就输出
    for(int i=0;i<g[x].size();i++){ //然后遍历每个儿子
        dfs(g[x][i]);               //深搜
    }
}
int main(){
    int n;cin>>n;               //输入N表示N个语句
    cin>>na[1];mp[na[1]]=1;     //输出第一个结点的名字且NA与MP互存
    for(int i=1;i<=n;i++){      //扫一次
        string a;cin>>a;        //输入命令
        if(a[0]=='b'){          //出生
            string b,c;cin>>b;cin>>c;   //再输入两串
            g[mp[b]].push_back(++tot);  //B串对应的结点有一个儿子,编号是++TOT
            na[tot]=c;      //然后TOT编号的结点的名字是C
            mp[c]=tot;      //然后C对应的结点编号是TOT
            flag[tot]=1;    //最后出生当然要打上生存标记
        }
        else if(a[0]=='d'){    //死了
            string b;cin>>b;   //再读入一个串
            flag[mp[b]]=0;     //这个串所在结点生存标记清0
        }
    }
    dfs(1);
    return 0;
}
样例输入
4 KING  
birth KING ALI
birth KING BOB
birth ALI CARRO   
death ALI
样例输出
CARRO  
BOB

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值