试题编号: | 201703-3 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
试题名称: | Markdown | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
时间限制: | 1.0s | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
内存限制: | 256.0MB | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
问题描述: | 问题描述 Markdown 是一种很流行的轻量级标记语言(lightweight markup language),广泛用于撰写带格式的文档。例如以下这段文本就是用 Markdown 的语法写成的: 输入格式 输入由若干行组成,表示一个用本题规定的 Markdown 语法撰写的文档。 输出格式 输出由若干行组成,表示输入的 Markdown 文档转换成产生的 HTML 代码。 样例输入 # Hello 样例输出 <h1>Hello</h1> 评测用例规模与约定 本题的测试点满足以下条件:●本题每个测试点的输入数据所包含的行数都不超过100,每行字符的个数(包括行末换行符)都不超过100。 ●除了换行符之外,所有字符都是 ASCII 码 32 至 126 的可打印字符。 ●每行行首和行末都不会出现空格字符。 ●输入数据除了 Markdown 语法所需,内容中不会出现 `#`、`*`、`_`、`[`、`]`、`(`、`)`、`<`、`>`、`&` 这些字符。 ●所有测试点均符合题目所规定的 Markdown 语法,你的程序不需要考虑语法错误的情况。 每个测试点包含的语法规则如下表所示,其中“√”表示包含,“×”表示不包含。
提示 由于本题要将输入数据当做一个文本文件来处理,要逐行读取直到文件结束,C/C++、Java 语言的用户可以参考以下代码片段来读取输入内容。 |
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<regex,string>>trans{
{regex ("^\\* +(.*)"),"<li>$1</li>"},
{regex ("_([^_]+)_"),"<em>$1</em>"},
{regex ("\\[([^\\]]+)\\]\\(([^\\)]+)\\)"),"<a href=\"$2\">$1</a>"}
};
vector<vector<string>>cont(1);
int main(){
for(int i=1;i<=6;i++){
trans.push_back({regex ("^"+string(i,'#')+ " +(.*)"),"<h"+to_string(i)+">$1</h"+to_string(i)+">"});
}
string s;
while(getline(cin,s)){
if(s==""){
cont.push_back({});
}else{
cont.back().push_back(s);
}
}
string p;
for(auto &it:cont){
if(it.empty())continue;
int type=it[0][0]=='*'?1:it[0][0]=='#'?2:3;
if(type==1)cout<<"<ul>"<<endl;
if(type==3)cout<<"<p>";
for(int i=0;i<it.size();i++){
for( auto j:trans){
it[i]=regex_replace(it[i],j.first,j.second);
}
if(i!=it.size()-1){
cout<<it[i]<<endl;
}else{
cout<<it[i];
}
}
if(type==1){
cout<<endl;
cout<<"</ul>"<<endl;
}
else if(type==3)cout<<"</p>"<<endl;
else cout<<endl;
}
return 0;
}