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

本文讨论了如何在C++中处理字符串输入,包括使用getline读取前m行和n对变量名值,以及高效替换包含嵌套变量的字符串。作者分享了两种代码实现,一种暴力但超时,另一种使用unordered_map优化,达到90分并避免超时。
摘要由CSDN通过智能技术生成

题目描述

思路分析

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

第一、关于数据的读入

对于前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;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值