当前位置:首页 > 编程笔记 > 正文
已解决

【ccf-csp题解】第5次csp认证-第三题-模板生成系统-字符串模拟

来自网友在路上 151851提问 提问时间:2023-09-26 10:23:02阅读次数: 51

最佳答案 问答题库518位专家为你答疑解惑

题目描述

思路分析

这个是一个简单的字符串模拟题,但蕴藏了一些细节值得挖掘,故写于博客之中进行记录。

第一、关于数据的读入

对于前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,"");}elsealls[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;}elsecout<<str[++];}cout<<endl;}return 0;
}

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"【ccf-csp题解】第5次csp认证-第三题-模板生成系统-字符串模拟":http://eshow365.cn/6-13904-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!