201509-3 | |
试题名称: | 模板生成系统 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 输入格式 输入的第一行包含两个整数 m, n,分别表示模板的行数和模板生成时给出的变量个数。 输出格式 输出包含若干行,表示模板生成的结果。 样例输入 11 2 样例输出 <!DOCTYPE html> 评测用例规模与约定 0 ≤ m ≤ 100 |
思路:把变量记录下来,查找{{ 与 }} 判断变量是否有定义,如果有则根据值进行替换,否则替换为空值。
注意:需要在每一行循环进行直到没有模板标记为止。
这里有个坑点:st 与 en 的更新顺序
st = cur.find("{{",st);
en = cur.find("}}",st);
这个位置st,en顺序不能颠倒,因为如果先查找了st,st就被更新了导致下一步en更新错误
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<set>
#include<cstring>
#include<cmath>
#define fi first
#define se second
#define rep(i,j,k) for(int i=j;i<k;++i)
#define mst(a,b) memset((a),(b),sizeof(a))
using namespace std;
typedef long long LL;
typedef vector<int,int> pii;
int main()
{
//freopen("input.txt","r",stdin);
ios::sync_with_stdio(false);
cin.tie(NULL);
vector<string> vec;
map<string,string> mp;
vec.resize(205);
int n,m;
cin >> m >> n;
cin.get();
rep(i,0,m){
getline(cin,vec[i]);
}
string var,val;
rep(i,0,n){
cin >> var;
cin.get();
getline(cin,val);
val = val.substr(1,val.length()-2);
mp[var] = val;
}
int st,en;
rep(i,0,m){
string &cur = vec[i];
st = cur.find("{{");
en = cur.find("}}");
if(st != string::npos && en != string::npos){
while(st != string::npos && en != string::npos){
var = cur.substr(st+3,en-st-4);
if(mp.find(var) != mp.end()){
cur.replace(st,en+2-st,mp[var]);
en = cur.find("}}",st+mp[var].size()+1);
st = cur.find("{{",st+mp[var].size());
}
else{
cur.replace(st,en+2-st,"");
st = cur.find("{{",st); // 这个位置st,en顺序不能颠倒,因为查找了st st就被更新了导致en错误
en = cur.find("}}",st);
}
}
}
}
rep(i,0,m){
cout << vec[i] << endl;
}
return 0;
}