必须要记忆化吗?
查看原帖
必须要记忆化吗?
542905
WannaYellow楼主2022/4/16 22:49
#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,轻点喷)

2022/4/16 22:49
加载中...