问题描述
试题编号: | 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;
}