zoukankan      html  css  js  c++  java
  • CCF 201509-3 模版生成系统

    试题编号: 201509-3
    试题名称: 模板生成系统
    时间限制: 1.0s
    内存限制: 256.0MB
    问题描述
      成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是


      而当用户为 Jerry 时,网页的源代码是


      这样的例子在包含动态内容的网站中还有很多。为了简化生成网页的工作,成成觉得他需要引入一套模板生成系统。
      模板是包含特殊标记的文本。成成用到的模板只包含一种特殊标记,格式为 {{ VAR }},其中 VAR 是一个变量。该标记在模板生成时会被变量 VAR 的值所替代。例如,如果变量 name = "Tom",则 {{ name }} 会生成 Tom。具体的规则如下:
      ·变量名由大小写字母、数字和下划线 (_) 构成,且第一个字符不是数字,长度不超过 16 个字符。
      ·变量名是大小写敏感的,Name 和 name 是两个不同的变量。
      ·变量的值是字符串。
      ·如果标记中的变量没有定义,则生成空串,相当于把标记从模板中删除。
      ·模板不递归生成。也就是说,如果变量的值中包含形如 {{ VAR }} 的内容,不再做进一步的替换。
    输入格式
      输入的第一行包含两个整数 m, n,分别表示模板的行数和模板生成时给出的变量个数。
      接下来 m 行,每行是一个字符串,表示模板。
      接下来 n 行,每行表示一个变量和它的值,中间用一个空格分隔。值是字符串,用双引号 (") 括起来,内容可包含除双引号以外的任意可打印 ASCII 字符(ASCII 码范围 32, 33, 35-126)。
    输出格式
      输出包含若干行,表示模板生成的结果。
    样例输入
    11 2
    <!DOCTYPE html>
    <html>
    <head>
    <title>User {{ name }}</title>
    </head>
    <body>
    <h1>{{ name }}</h1>
    <p>Email: <a href="mailto:{{ email }}">{{ email }}</a></p>
    <p>Address: {{ address }}</p>
    </body>
    </html>
    name "David Beckham"
    email "david@beckham.com"
    样例输出
    <!DOCTYPE html>
    <html>
    <head>
    <title>User David Beckham</title>
    </head>
    <body>
    <h1>David Beckham</h1>
    <p>Email: <a href="mailto:david@beckham.com">david@beckham.com</a></p>
    <p>Address: </p>
    </body>
    </html>
    评测用例规模与约定
      0 ≤ m ≤ 100
      0 ≤ n ≤ 100
      输入的模板每行长度不超过 80 个字符(不包含换行符)。
      输入保证模板中所有以 {{ 开始的子串都是合法的标记,开始是两个左大括号和一个空格,然后是变量名,结尾是一个空格和两个右大括号。
      输入中所有变量的值字符串长度不超过 100 个字符(不包括双引号)。
      保证输入的所有变量的名字各不相同。
     

    思路:
    1、控制好输入,建立变量名的是时候不能乱起名字
    line:用来处理当前读入的那一行
    2、先把所有待处理的数据放入动态数组shuru中
    3、对于key值的处理:以空格为分界,把空格前与空格后的两个字符串存到map中,建立映射的关系
    4、利用string自带的find函数搜索要处理的数据中是否存在{{与}}
    如果发现了(返回值不为-1):
    (1)把{{ }}内的字符串截取出来复制到var中。
    (2)在(映射map)key中寻找var值对应的函数是否存在映射关系
    如果有 通过replace函数把包括前后"{{""}}"在内的元素替换成map中对应的字符串
    如果没有 则替换成""(空)
    如果没有 则继续搜索
    5、在原数据上修改替换就可以了

    一开始写的时候每次搜索都从每行数据的开头开始搜索,没有改变pos的值,结果超时了

    后来每次替换一个词最后都要令pos加上替换词的长度重新搜索才过的。

     
     1 #include<iostream>
     2 #include<vector>
     3 #include<string>
     4 #include<map>
     5 using namespace std;
     6 int main()
     7 {
     8     int hang,ci;
     9     vector<string> shuru;
    10     map<string,string> key;
    11     string line;//处理当前这一行
    12     cin>>hang>>ci;
    13     cin.ignore();
    14     for(int i=0; i<hang; i++)
    15     {
    16         getline(cin,line);
    17         shuru.push_back(line);//把当前行数据塞到动态数组shuru中
    18     }
    19     for(int i=0; i<ci; i++)
    20     {
    21         getline(cin,line);
    22         int kongge=line.find(" ");
    23         key.insert(map<string,string>::value_type(line.substr(0,kongge),line.substr(kongge)));//对于substr函数,只键入一个参数的时候默认为从这个参数指示的位置开始到结束
    24     }
    25     //下面开始逐行处理输入的词
    26     for(int i=0; i<hang; i++)
    27     {
    28         int pos=0,op,ed;
    29         while(pos<shuru[i].length())
    30         {
    31             op=shuru[i].find("{{",pos);
    32             ed=shuru[i].find("}}",op);
    33             if(op>=0&&ed>=0)//发现了该行有需要替换的地方
    34             {
    35                 string var=shuru[i].substr(op+3,ed-op-3-1);
    36                 if(key.count(var))
    37                 {
    38                     string ans=key[var].substr(2,key[var].length()-3);//这个”3“包含了 【 "】以及末尾的【"】;
    39                     shuru[i].replace(op,var.length()+6,ans);
    40                 }
    41                 else
    42                 {
    43                     shuru[i].replace(op,var.length()+6,"");
    44                 }
    45                 pos=op+var.length();//防止超时。。
    46             }
    47             else
    48             {
    49                 pos=shuru[i].length();
    50             }
    51         }
    52         cout<<shuru[i]<<endl;
    53     }
    54     return 0;
    55 }
     
  • 相关阅读:
    Spring Boot中的JSON技术
    Spring Boot中编写单元测试
    如何保证事务方法的幂等
    定时重试线程池
    多线程导致事务失效-记一次性能优化
    自己实现一个简单的数据库事务
    服务器错误码国际化
    spring自定义自动配置注解
    springboot中如何启动tomcat
    用grep来查询日志
  • 原文地址:https://www.cnblogs.com/AKsnoopy/p/6553104.html
Copyright © 2011-2022 走看看