问题描述
试题编号: | 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 语言的用户可以参考以下代码片段来读取输入内容。
|
题目分析:
首先分析如何存储这些字符串,思考是将原来的Markdown文本整个存储起来然后进行处理,还是以段落分块处理,处理完一个分块再去处理下一个,这道题比较适合的是分块处理,因为块与块之间不涉及到嵌套问题,相互独立。
块和块的界限是空行,区块可以分为三类:段落、无序列表(*)、标题(#),段落中的每一行有强调和超级链接(_string_和[link](text)),据题意这两者可能嵌套出现。
题目分析完,解决的思路就有了,针对三种区块写三种处理区块的函数,再对段落里的每一个句子调用处理句子的函数,而这个处理行内结构的句子,应当是一个递归调用的过程。
#include<bits/stdc++.h>
using namespace std;
string strs[101];
int tag=0;
void print(string str)
{
int i,j,k;
for(i=0;i<str.length();i++)
{
if(str[i]=='_')
{
j=str.find('_',i+1);
string temp=str.substr(i+1,j-i-1);
cout<<"<em>";
print(temp);
cout<<"</em>";
i=j;
}
else if(str[i]=='[')
{
j=str.find(']',i+1);
string Text=str.substr(i+1,j-i-1);
k=str.find(')',j+1);
string Link=str.substr(j+2,k-j-2);
cout<<"<a href=\""<<Link;
cout<<"\">";
print(Text);
cout<<"</a>";
i=k;
}
else
{
cout<<str[i];
}
}
}
void sorth()
{
int i;
string str=strs[0];
int cnt=0;
for(i=0;i<str.length();i++)
{
if(str[i]=='#')
cnt++;
else
break;
}
while(str[i]==' ')
i++;
str=str.substr(i,str.length()-i);
cout<<"<h"<<cnt<<">";
print(str);
cout<<"</h"<<cnt<<">"<<endl;
}
void sortp(int cnt)
{
int i;
cout<<"<p>";
print(strs[0]);
for(i=1;i<cnt;i++)
{
cout<<endl;
print(strs[i]);
}
cout<<"</p>";
cout<<endl;
}
void sortl(int cnt)
{
int i,j;
cout<<"<ul>"<<endl;
for(i=0;i<cnt;i++)
{
string str=strs[i];
j=1;
while(str[j]==' ')
{
j++;
}
str=str.substr(j,str.length()-j);
print("<li>"+str+"</li>");
cout<<endl;
}
cout<<"</ul>"<<endl;
}
int main()
{
freopen("5.txt","r",stdin);
int cnt=0;
int tag=0;
string line;
while(getline(cin,line))
{
if(line=="")
{
if(tag==1)
{
if(strs[0][0]=='#')
sorth();
else if(strs[0][0]=='*')
sortl(cnt);
else
sortp(cnt);
tag=0;
cnt=0;
}
}
else
{
strs[cnt++]=line;
tag=1;
}
}
if(cnt!=0)
{
if(strs[0][0]=='#')
sorth();
else if(strs[0][0]=='*')
sortl(cnt);
else
sortp(cnt);
}
}