不是哥们,为什么MLE?
查看原帖
不是哥们,为什么MLE?
525687
Wang1006楼主2025/6/16 22:32

Rt,MLE80,根据 n<=100n<=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";
		}
	}
}
2025/6/16 22:32
加载中...