题目大意就不说了相信各位,都是来看坑点的。
这是一个很简单的模拟题,相信很多人可能卡在80或者90,更多的是90 。
坑点1:
题目说不需要递归生成,不是说没有这种样例,没考虑的可以试一下这个样例
1 2
<h1>{{ name }}</h1>
name "David Beckham {{ email }}"
email "david@beckham.com"
-----------输出答案----------
<h1>David Beckham {{ email }}</h1>
坑点2:
这是一个很奇怪的坑点,如果你在截取 {{ name }} 这个字符串的时候判断终点是最后那个空格的话,会扣十分,很气有没 有。我测试了一下,如果是判断 }} 为结尾是100,判断空格结束是90。具体原因不明
另外,今天自己字符串打的模拟,很冗余,如果用string自带函数的话会非常方便。
s . find ("要匹配的字符串",起始下标) 第一个匹配到的第一个字符下标
s . strsub (起始下标,截取多长) 返回值为截取的string
s . replace(起始下标,截取多长,替换成谁) void
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e5+5;
int m,n;
map<string,string>mp;
string C[MAXN];
int main()
{
cin>>m>>n;
getchar();
for(int i=1;i<=m;i++){
getline(cin,C[i]);
}
for(int i=1;i<=n;i++){
string kk,a = "",b="";
bool f = 0;
getline(cin,kk);
int len = kk.size();
int idx = kk.find(" ");
a = kk.substr(0,idx);
b = kk.substr(idx+2,len-idx-3);
mp[a] = b;
}
for(int i=1;i<=m;i++){
int now_idx = 0;
int len = C[i].size();
while(1){
int p1 = C[i].find("{{",now_idx);
int p2 = C[i].find("}}",now_idx);
if(p1 == -1 || p2 == -1)break;
string tmp = C[i].substr(p1+3,p2-p1-4);
C[i].replace(p1,p2-p1+2,mp.count(tmp)?mp[tmp]:"");
now_idx = p1 + mp[tmp].size();
}
cout<<C[i]<<endl;
}
}