問題描述
試題編號: | 201703-3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
試題名稱: | Markdown | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
時間限制: | 1.0s | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
內存限制: | 256.0MB | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
問題描述: |
問題描述
Markdown 是一種很流行的輕量級標記語言(lightweight markup language),廣泛用於撰寫帶格式的文檔。例如以下這段文本就是用 Markdown 的語法寫成的:
![]() 這些用 Markdown 寫成的文本,盡管本身是純文本格式,然而讀者可以很容易地看出它的文檔結構。同時,還有很多工具可以自動把 Markdown 文本轉換成 HTML 甚至 Word、PDF 等格式,取得更好的排版效果。例如上面這段文本通過轉化得到的 HTML 代碼如下所示: ![]() 本題要求由你來編寫一個 Markdown 的轉換工具,完成 Markdown 文本到 HTML 代碼的轉換工作。簡化起見,本題定義的 Markdown 語法規則和轉換規則描述如下: ●區塊:區塊是文檔的頂級結構。本題的 Markdown 語法有 3 種區塊格式。在輸入中,相鄰兩個區塊之間用一個或多個空行分隔。輸出時刪除所有分隔區塊的空行。 ○段落:一般情況下,連續多行輸入構成一個段落。段落的轉換規則是在段落的第一行行首插入 `<p>`,在最后一行行末插入 `</p>`。 ○標題:每個標題區塊只有一行,由若干個 `#` 開頭,接着一個或多個空格,然后是標題內容,直到行末。`#` 的個數決定了標題的等級。轉換時,`# Heading` 轉換為 `<h1>Heading</h1>`,`## Heading` 轉換為 `<h2>Heading</h2>`,以此類推。標題等級最深為 6。 ○無序列表:無序列表由若干行組成,每行由 `*` 開頭,接着一個或多個空格,然后是列表項目的文字,直到行末。轉換時,在最開始插入一行 `<ul>`,最后插入一行 `</ul>`;對於每行,`* Item` 轉換為 `<li>Item</li>`。本題中的無序列表只有一層,不會出現縮進的情況。 ●行內:對於區塊中的內容,有以下兩種行內結構。 ○強調:`_Text_` 轉換為 `<em>Text</em>`。強調不會出現嵌套,每行中 `_` 的個數一定是偶數,且不會連續相鄰。注意 `_Text_` 的前后不一定是空格字符。 ○超級鏈接:`[Text](Link)` 轉換為 `<a href="Link">Text</a>`。超級鏈接和強調可以相互嵌套,但每種格式不會超過一層。
輸入格式
輸入由若干行組成,表示一個用本題規定的 Markdown 語法撰寫的文檔。
輸出格式
輸出由若干行組成,表示輸入的 Markdown 文檔轉換成產生的 HTML 代碼。
樣例輸入
# Hello
Hello, world!
樣例輸出
<h1>Hello</h1>
<p>Hello, world!</p>
評測用例規模與約定
本題的測試點滿足以下條件:
●本題每個測試點的輸入數據所包含的行數都不超過100,每行字符的個數(包括行末換行符)都不超過100。 ●除了換行符之外,所有字符都是 ASCII 碼 32 至 126 的可打印字符。 ●每行行首和行末都不會出現空格字符。 ●輸入數據除了 Markdown 語法所需,內容中不會出現 `#`、`*`、`_`、`[`、`]`、`(`、`)`、`<`、`>`、`&` 這些字符。 ●所有測試點均符合題目所規定的 Markdown 語法,你的程序不需要考慮語法錯誤的情況。 每個測試點包含的語法規則如下表所示,其中“√”表示包含,“×”表示不包含。
提示
由於本題要將輸入數據當做一個文本文件來處理,要逐行讀取直到文件結束,C/C++、Java 語言的用戶可以參考以下代碼片段來讀取輸入內容。
![]() ![]() ![]() |
直接模擬,考試時用文件讀入進行測試,結果提交代碼時忘記把文件讀入注釋掉,結果直接得了0分,過后練習時把代碼中文件讀入注釋掉改為標准輸入,就100分了。。就這樣因為兩個斜杠和400分失之交臂。。
代碼如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAX=105; 4 string strs[MAX]; 5 6 void output(string str) 7 { 8 int len=str.length(); 9 for(int i=0;i<len;i++) 10 { 11 if(str[i]=='_') 12 { 13 int r=str.find('_',i+1); 14 string tmp="<em>"+str.substr(i+1,r-i-1)+"</em>"; 15 output(tmp); 16 i=r; 17 } 18 else if(str[i]=='[') 19 { 20 int r=str.find(']',i+1); 21 string text=str.substr(i+1,r-i-1); 22 23 int l=str.find('(',r+1); 24 int linkr=str.find(')',r+1); 25 26 string link=str.substr(l+1,linkr-l-1); 27 string tmp="<a href=\""+link+"\">"+text+"</a>"; 28 29 output(tmp); 30 31 i=linkr; 32 } 33 else 34 printf("%c",str[i]); 35 } 36 } 37 38 void solve_h() 39 { 40 int len=strs[0].length(); 41 42 int pos=len,cnt=0; 43 for(int i=0;i<len;i++) 44 { 45 if(strs[0][i]=='#') 46 cnt++; 47 if(strs[0][i]!='#'&&strs[0][i]!=' ') 48 { 49 pos=i; 50 break; 51 } 52 } 53 54 cout<<"<h"<<cnt<<">"; 55 output(strs[0].substr(pos)); 56 cout<<"</h"<<cnt<<">"<<endl; 57 } 58 59 void solve_p(int cnt) 60 { 61 cout<<"<p>"; 62 for(int i=0;i<cnt;i++) 63 { 64 output(strs[i]); 65 66 if(i==cnt-1) 67 cout<<"</p>"; 68 69 cout<<endl; 70 } 71 } 72 73 void solve_l(int cnt) 74 { 75 cout<<"<ul>"<<endl; 76 77 for(int i=0;i<cnt;i++) 78 { 79 int len=strs[i].length(); 80 int pos=len,cnt=0; 81 82 for(int j=1;j<len;j++) 83 if(strs[i][j]!=' ') 84 { 85 pos=j; 86 break; 87 } 88 89 cout<<"<li>"; 90 output(strs[i].substr(pos)); 91 cout<<"</li>"<<endl; 92 } 93 cout<<"</ul>"<<endl; 94 } 95 96 int main() 97 { 98 //freopen("in.txt","r",stdin); 99 std::string line; 100 101 int cnt=0; 102 while(getline(std::cin,line)) 103 { 104 if(line=="") 105 { 106 if(cnt==0) 107 continue; 108 109 if(strs[0][0]=='#') 110 solve_h(); 111 else if(strs[0][0]=='*') 112 solve_l(cnt); 113 else 114 solve_p(cnt); 115 116 cnt=0; 117 continue; 118 } 119 120 strs[cnt++]=line; 121 } 122 123 if(cnt) 124 { 125 if(strs[0][0]=='#') 126 solve_h(); 127 else if(strs[0][0]=='*') 128 solve_l(cnt); 129 else 130 solve_p(cnt); 131 } 132 return 0; 133 }