题目描述
思路分析
这个是一个简单的字符串模拟题,但蕴藏了一些细节值得挖掘,故写于博客之中进行记录。
第一、关于数据的读入
对于前m行,直接使用getline函数进行读入即可,注意在读取完m和n之后,要写一个getchar()吸收回车
对于接下来的n行,需要读入两个内容,第一是变量名,第二是变量值,由于变量名和变量值之间有空格,所以对于变量名的读取直接使用cin即可,对于变量值,由于要读取的内容在双引号之间,所以可以使用如下技巧读取(来自y总网课)
string key, value;
cin >> key;
char c;
while (c = getchar(), c != '\"');
while (c = getchar(), c != '\"') value += c;
vars[key] = value;
第二、如何替换
我自己写的代码是用了一堆string自带的函数,包括replace、substr和find
最后在csp网站上提交是90分,显示超时,可能是写的太暴力导致的
90分代码放下面,大家看个乐子就好
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;
int m,n;
vector<string>alls;
map<string,string>get_value;
int main()
{
scanf("%d%d",&m,&n);
getchar();
for(int i=1;i<=m;i++)
{
string temp;
getline(cin,temp);
alls.push_back(temp);
}
for(int i=1;i<=n;i++)
{
string temp;
getline(cin,temp);
int index=temp.find(' ');
string sub1=temp.substr(0,index);
string sub2=temp.substr(index+2,temp.length()-index-3);
get_value[sub1]=sub2;
}
for(int i=0;i<m;i++)
{
int index1,index2;
do
{
index1=alls[i].find("{{ ");
if(index1!=-1)
index2=alls[i].find(" }}",index1+1);
else break;
if(index2==-1)break;
string name=alls[i].substr(index1+3,index2-index1-3);
if(!get_value.count(name))
{
alls[i].replace(index1,index2-index1+3,"");
}
else
alls[i].replace(index1,index2-index1+3,get_value[name]);
}while(index1!=-1&&index2!=-1);
cout<<alls[i]<<endl;
}
return 0;
}
y总一百分代码
#include<iostream>
#include<unordered_map>
#include<vector>
#include<string>
using namespace std;
vector<string>strs;
unordered_map<string,string>vals;
int n,m;
int main()
{
cin>>m>>n;
getchar();
while(m--)
{
string str;
getline(cin,str);
strs.push_back(str);
}
while(n--)
{
string key,value;
char c;
cin>>key;
while(c=getchar(),c!='\"');
while(c=getchar(),c!='\"')value+=c;
vals[key]=value;
}
for(auto &str:strs)
{
for(int i=0;i<str.size();i++)
{
if(i+1<str.size()&&str[i]=='{'&&str[i+1]=='{')
{
int j=i+2;
string key;
while(str[j]!=' '||str[j+1]!='}'||str[j+2]!='}')key+=str[++j];
cout<<vals[key];
i=j+2;
}
else
cout<<str[++];
}
cout<<endl;
}
return 0;
}