//给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
校选拔赛G题
最新推荐文章于 2019-08-04 19:39:22 发布