问题描述
试题编号: | 201509-3 |
试题名称: | 模板生成系统 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是 输入格式 输入的第一行包含两个整数 m, n,分别表示模板的行数和模板生成时给出的变量个数。 输出格式 输出包含若干行,表示模板生成的结果。 样例输入 11 2 样例输出 <!DOCTYPE html> 评测用例规模与约定 0 ≤ m ≤ 100 |
本题是简单的字符串匹配问题,开始我用了好多STL库,用map来储存变量和他的值,用replace来替换字符串,写出来的代码又简洁优雅又通俗易懂,结果90分超时了。。。
于是开始用二维数组来代替map,用字符串的+运算来代替replace,努力了半天终于通过了。详见注释,代码如下:
#include<iostream>
#include<string.h>
using namespace std;
//stan数组用来保存模板
string stan[110];
//in数组用来保存变量和他的值
string in[110][2];
int main()
{int m,n;cin>>m>>n;//因为下面紧接着要用getline,所以处理一下换行符 getchar();for(int i=0;i<m;i++)getline(cin,stan[i]);for(int i=0;i<n;i++){cin>>in[i][0];//因为变量的值中可能含有空格,所以用getline,所以这里处理一下换行符 getchar();getline(cin,in[i][1]);//将变量的值两端的双引号去掉 in[i][1]=in[i][1].substr(1,in[i][1].length()-2);}for(int i=0;i<m;i++){string out="";while(1){bool flag=true;//判断模板中是否还有变量 int index=stan[i].find("{
{"),j=stan[i].find("}}");if(index<0 || j<0)break;//将变量截取出来,判断是否在二维数组in中 string temp=stan[i].substr(index+3,j-index-4);for(int j=0;j<n;j++){if(temp==in[j][0]){flag=false;temp=in[j][1];break;}}//如果不在,就用空串代替 if(flag)temp="";//将变量用他的值替换掉,out保存变量之前的字符串及变量的值out+=stan[i].substr(0,index)+temp;//stan[i]现在只保存变量之后的字符串 stan[i]=stan[i].substr(j+2,stan[i].length()-j-2);}cout<<out+stan[i]<<endl;}return 0;
}