#include<iostream>
#include<string>
#include<map>
#include<unordered_map>
using namespace std;
int n;
map<string,string>libr;
unordered_map<string,bool>tag;
void add(string key,string val){
libr[key]=val;
tag[key]=false;
}
void pop(string key){
libr.erase(key);
tag.erase(key);
}
bool check(char x){
for(char i='a';i<='z';i++)if(x==i)return true;
for(char i='A';i<='Z';i++)if(x==i)return true;
for(char i='0';i<='9';i++)if(x==i)return true;
if(x=='_')return true;
return false;
}
void execute(string val){
string sub[1005]={};
int cnt=0,st=0,len=0;
for(int i=0;i<val.size();i++){
if(check(val[i]))len++;
else {
sub[++cnt]=val.substr(st,len);
sub[++cnt]=val[i];
st=i+1,len=0;
}
}
sub[++cnt]=val.substr(st,len);
for(int i=1;i<=cnt;i++){
//cout<<sub[i]<<endl;
bool tmp=true;
// for(auto itr=libr.begin();itr!=libr.end();itr++){
if(libr.find(sub[i])!=libr.end()){
if(tag[sub[i]]==false){
tag[sub[i]]=true;
execute(libr[sub[i]]);
tag[sub[i]]=false;
tmp=false;
}
//break;
}
// }
if(tmp)cout<<sub[i];
}
}
void divide(int x,string ori){
string def="chushihua",macro="chushihua",val;
int st=0,len=0,flag=0;
for(int i=0;i<ori.size();i++){
if(flag>1)break;
if(ori[i]!=' ') len++;
else if(ori[i]==' '){
if(flag==0){
def=ori.substr(st,len);
if(def!="#define"&&def!="#undef")break;
else st=i+1,flag++,len=0;
}else if(flag==1){
macro=ori.substr(st,len);
st=i+1;
flag++;
}
}
}
ori=ori.substr(0,ori.size()-1);
if(st<ori.size())val=ori.substr(st);
if(def=="#define"){
// cout<<"add "<<macro<<' '<<val<<endl;
add(macro,val);
}else if(def=="#undef"){
// cout<<"pop "<<macro<<endl;
pop(macro);
}else{
// cout<<"execute "<<val<<endl;
execute(val);
}
cout<<endl;
}
int main(){
cin>>n;
getchar();
for(int i=1;i<=n;i++){
string tmp;
getline(cin,tmp);
tmp+=' ';
divide(i,tmp);
}
return 0;
}
RT
最后一个点T了,90分 (弱省oier,轻点喷)