Rt,MLE80,根据 n<=100 和每行输入不超过100字符,出不超过1000字符,不应该啊。。。
思路:map映射、递归展开。
记录:提交记录
代码:
#include<iostream>
#include<map>
using namespace std;
int n;
string s;
map<string,bool>mpex;
map<string,string>mp,f;
bool letter(char c){
return ('A'<=c&&c<='Z')||('a'<=c&&c<='z');
}
string unfold(string s){
if(f[s].size()!=0){
return f[s];
}
string ret,tmp;
for(int i=0;i<s.size();++i){
if(letter(s[i])==0){
if(tmp.size()){
if(mpex[tmp]){
ret+=unfold(mp[tmp]);
}
else{
ret+=tmp;
}
tmp="";
}
ret.push_back(s[i]);
}
else{
tmp.push_back(s[i]);
}
}
if(tmp.size()){
if(mpex[tmp]){
ret+=unfold(mp[tmp]);
}
else{
ret+=tmp;
}
}
f[s]=ret;
return ret;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n;getline(cin,s);
for(int i=1;i<=n;++i){
getline(cin,s);
if(s[0]=='#'){
char opt_cstr[10];
sscanf(s.c_str(),"#%s ",opt_cstr);
string opt=opt_cstr,name,content;
if(opt=="define"){
s=s.substr(8,string::npos);
int p=0;
while(s[p]!=' '){
name.push_back(s[p]);
p++;
}
p++;
while(p<s.size()){
content.push_back(s[p]);
p++;
}
mpex[name]=1;mp[name]=content;
// cout<<"[Note]Defined "<<name<<" as "<<content<<endl;
}
else{
s=s.substr(7,string::npos);
int p=0;
while(p<s.size()){
name.push_back(s[p]);
p++;
}
// cout<<"[Note]Undefined "<<name<<endl;
mpex[name]=0;mp[name]="";
}
f.clear();
cout<<"\n";
}
else{
cout<<unfold(s)<<"\n";
}
}
}