CCF上的題
試題編號: 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="https://bbs.csdn.net/topics/Link">Text</a>。超級鏈接和強調可以相互嵌套,但每種格式不會超過一層。
輸入格式
輸入由若干行組成,表示一個用本題規定的 Markdown 語法撰寫的檔案。
輸出格式
輸出由若干行組成,表示輸入的 Markdown 檔案轉換成產生的 HTML 代碼。
樣例輸入
# Hello
Hello, world!
樣例輸出
<h1>Hello</h1>
<p>Hello, world!</p>
評測用例規模與約定
本題的測驗點滿足以下條件:
本題每個測驗點的輸入資料所包含的行數都不超過100,每行字符的個數(包括行末換行符)都不超過100。
除了換行符之外,所有字符都是 ASCII 碼 32 至 126 的可列印字符。
每行行首和行末都不會出現空格字符。
輸入資料除了 Markdown 語法所需,內容中不會出現 #、*、_、[、]、(、)、<、>、& 這些字符。
所有測驗點均符合題目所規定的 Markdown 語法,你的程式不需要考慮語法錯誤的情況。
每個測驗點包含的語法規則如下表所示,其中“√”表示包含,“×”表示不包含。
測驗點編號 段落 標題 無序串列 強調 超級鏈接
1 √ × × × ×
3 √ × √ × ×
4 √ × × √ ×
5 √ × × × √
6 √ √ √ × ×
7 √ × × √ √
8 √ √ × √ ×
9 √ × √ × √
10 √ √ √ √ √
————————————————
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
string link_sub(string s, int fid, int mid, int eid)
{
string ans = s.substr(fid, mid - fid);
string temp = s.substr(mid + 1, eid - mid-1);
int l = temp.size();
for (int i = 0; i<l; i++)
{
if (temp[i] == ']' || temp[i] == '(')
temp[i] = ' ';
}
string text, link;
stringstream ss(temp);
ss >> text >> link;
string str= "<a href=https://bbs.csdn.net/"" + link + "\">" + text + "</a>";
ans += str;
return ans;
}
string str_link(string s)
{
string str="";
int fid = 0, mid=0, len = s.size();
for (int i = 0; i<len; i++)
{
if (s[i] == '[')
mid = i;
else if (s[i] == ')')
{
str += link_sub(s, fid, mid, i);
fid = i + 1;
}
}
if (fid != len)
str += s.substr(fid);
return str;
}
string str_em(string s)
{
int len = s.size(), flag = 0;
for (int i = len - 1; i >= 0; i--)
{
if (s[i] == '_')
{
flag++;
if (flag % 2 == 1)
s = s.replace(i, 1, "</em>");
else
s = s.replace(i, 1, "<em>");
}
}
return s;
}
string func_str(string str)
{
string s = str_link(str);
return str_em(s);
}
void func_1(string line, int len)
{
int i, num = 0;
for (i = 0; i<len; i++)
{
if (line[i] == '#')
num++;
else if (line[i] != ' ')
break;
}
cout << "<h" << num << ">";
string s = func_str(line.substr(i));
cout << s << "</h" << num << ">" << endl;
}
void func_2(string line, int len)
{
int i;
for (i = 1; i<len; i++)
{
if (line[i] != ' ')
break;
}
string s = func_str(line.substr(i));
cout << "<li>" << s << "</li>" << endl;
}
void func_3(string line)
{
line = func_str(line);
cout << line;
}
int func_line(string line, int len, int flag)
{
if (len == 0)
{
if (flag == 2)
cout << "</p>" << endl;
else if (flag == 1)
cout << "</ul>" << endl;
flag = 0;
}
else if (line[0] == '#')
{
func_1(line, len);
flag = 0;
}
else if (line[0] == '*')
{
if (flag == 0)
cout << "<ul>" << endl;
func_2(line, len);
flag = 1;
}
else
{
if (flag == 0)
cout << "<p>";
else
cout << endl;
func_3(line);
flag = 2;
}
return flag;
}
int main()
{
string line;
int flag = 0;
//freopen("3.txt", "r", stdin);
while (getline(cin, line))
{
int l = line.size();
flag = func_line(line, l, flag);
}
if (flag == 1)
cout << "</ul>" << endl;
else if (flag == 2)
cout << "</p>" << endl;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/72813.html
標籤:C++ 語言
