1. 程式人生 > >【CCF】模板生成系統

【CCF】模板生成系統

== req 文本 fin nth mat vid using 規模

問題描述   成成最近在搭建一個網站,其中一些頁面的部分內容來自數據庫中不同的數據記錄,但是頁面的基本結構是相同的。例如,對於展示用戶信息的頁面,當用戶為 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 "[email protected]" 樣例輸出 <!DOCTYPE html>
<html>
<head>
<title>User David Beckham</title>
</head>
<body>
<h1>David Beckham</h1>
<p>Email: <a href="mailto:[email protected]">[email protected]</a></p>
<p>Address: </p>
</body>
</html> 評測用例規模與約定   0 ≤ m
≤ 100
  0 ≤ n ≤ 100
  輸入的模板每行長度不超過 80 個字符(不包含換行符)。
  輸入保證模板中所有以 {{ 開始的子串都是合法的標記,開始是兩個左大括號和一個空格,然後是變量名,結尾是一個空格和兩個右大括號。
  輸入中所有變量的值字符串長度不超過 100 個字符(不包括雙引號)。
  保證輸入的所有變量的名字各不相同。 分析 思路並不難,就是找到相應內容並替換。卡在了不會用函數上面,用replace()函數進行替換十分簡單,也不用考慮位數是否一致的問題。
 1 #include <iostream>
 2 #include <iomanip>
 3 #include <cstdio>
 4
#include <string.h> 5 #include <cstring> 6 #include <algorithm> 7 #include <cmath> 8 #include <string> 9 #include <queue> 10 #include <map> 11 #include <vector> 12 #include <set> 13 #include <list> 14 using namespace std; 15 typedef long long ll; 16 const int INF = 0x3f3f3f3f; 17 const int NINF = 0xc0c0c0c0; 18 const int maxn = 2005; 19 int MonthDay[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 20 string MonthName[] = {"Jan","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; 21 string DayName[] = {"Sun", "Mon","Tue","Wed","Thu","Fri","Sat"}; 22 23 int main() { 24 freopen("/Users/kangyutong/Desktop/in.txt","r",stdin); 25 int n, m; 26 cin >> n >> m; 27 getchar(); 28 vector<string> s; 29 string str, str1; 30 for(int i = 0; i < n; i++) { 31 getline(cin, str); 32 // cout << str << endl; 33 s.push_back(str); 34 } 35 map<string, string> var; 36 for(int i = 0; i < m; i++) { 37 getline(cin,str); 38 string temp = ""; 39 int pos = str.find(" "); 40 // cout << str.size() << endl; 41 var[str.substr(0,pos)] = str.substr(pos+2, str.size()-pos-3); 42 // cout << str.substr(0,pos) << " " << str.substr(pos+2, str.size()-pos-3) << endl; 43 } 44 for(int i = 0; i < n; i++) { 45 int pre = 0, nextt = 0; 46 while(true) { 47 pre = s[i].find("{{ ", pre); 48 nextt = s[i].find(" }}", nextt); 49 cout << pre << " " << nextt << endl; 50 if(pre == string::npos || nextt == string::npos) break; 51 string temp = s[i].substr(pre+3, nextt-pre-3); 52 // cout << temp << endl; 53 s[i].replace(pre, nextt-pre+3, var.count(temp)?var[temp]:""); 54 pre += var.count(temp)?var[temp].length():0; 55 } 56 cout << s[i] << endl; 57 } 58 return 0; 59 }

【CCF】模板生成系統