问题描述 Markdown 是一种很流行的轻量级标记语言(lightweight markup language),广泛用于撰写带格式的文档。例如以下这段文本就是用 Markdown 的语法写成的: 输入格式 输入由若干行组成,表示一个用本题规定的 Markdown 语法撰写的文档。 输出格式 输出由若干行组成,表示输入的 Markdown 文档转换成产生的 HTML 代码。 样例输入 # Hello 样例输出 <h1>Hello</h1> 评测用例规模与约定 本题的测试点满足以下条件:●本题每个测试点的输入数据所包含的行数都不超过100,每行字符的个数(包括行末换行符)都不超过100。 ●除了换行符之外,所有字符都是 ASCII 码 32 至 126 的可打印字符。 ●每行行首和行末都不会出现空格字符。 ●输入数据除了 Markdown 语法所需,内容中不会出现 `#`、`*`、`_`、`[`、`]`、`(`、`)`、`<`、`>`、`&` 这些字符。 ●所有测试点均符合题目所规定的 Markdown 语法,你的程序不需要考虑语法错误的情况。 每个测试点包含的语法规则如下表所示,其中“√”表示包含,“×”表示不包含。
提示 由于本题要将输入数据当做一个文本文件来处理,要逐行读取直到文件结束,C/C++、Java 语言的用户可以参考以下代码片段来读取输入内容。 |
初次提交只得了50分,忘记istringstream按空格输入了,如果标题等地方文字中出现空格,字符串取不全。如果考试中没有评分系统,真的就挂掉啊TAT
#include<iostream>
#include<string>
#include <cctype>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <sstream>
using namespace std;
int flag=0;//1--段落,2--标题,3--列表
int flag2=1;//列表判断
int flag3=0;
void link(string &s,int a,int b);
void em(string &s,int a,int b)
{
L: ;
int n=s.find('_');
if(n>=0)
{
s[n]=':';
int m=s.find('_');
//cout<<n<<" "<<m<<endl;
string ss(s,n+1,m-n-1);
//cout<<"em "<<ss<<endl;
s.erase(n,m-n+1);
s.insert(n,"<em>"+ss+"</em>");
//cout<<s<<endl;
goto L;
}
if(b<=2)
link(s,a,b+1);
}
void link(string &s,int a,int b)
{
LL: ;
int n=s.find('[');
if(n>=0)
{
int m=s.find(']');
//cout<<n<<" "<<m<<endl;
string ss(s,n+1,m-n-1);
//cout<<"link "<<ss<<endl;
int nn=s.find('(');
int mm=s.find(')');
string sss(s,nn+1,mm-nn-1);
//cout<<sss<<endl;
s.erase(n,mm-n+1);
s.insert(n,"<a href=\""+sss+"\">"+ss+"</a>");
//cout<<s<<endl;
goto LL;
}
if(a<=2)
em(s,a+1,b);
}
int main()
{
string s;
while(getline(cin,s))
{
if(s.size()==0)
{
if(flag3)
{
cout<<"</p>"<<endl;
flag3=0;
}
if(flag2==0)
{
cout<<"</ul>"<<endl;
flag2=1;
}
}
else if(s.size()>=1)
{
if(s[0]=='#')
{
int sum=0,i=0;
while(s[i]=='#')
{
++sum;
++i;
}
if(sum>6)
sum=6;
cout<<"<h"<<sum<<">";
istringstream is(s);
string ss;
is>>ss;
getline(is,ss);
int h=0;
//cout<<"fs"<<ss<<endl;
while(ss[h]==' ')
++h;
ss.erase(0,h);
em(ss,1,0);
link(ss,0,1);
cout<<ss;
cout<<"</h"<<sum<<">"<<endl;
}
else if(s[0]=='*')
{
if(flag2)
{
cout<<"<ul>"<<endl;
flag2=0;
}
istringstream is(s);
string ss;
is>>ss;
getline(is,ss);
int h=0;
//cout<<"fs"<<ss<<endl;
while(ss[h]==' ')
++h;
ss.erase(0,h);
em(ss,1,0);
link(ss,0,1);
cout<<"<li>"<<ss<<"</li>"<<endl;
}
else
{
if(flag3)
cout<<endl;
else
cout<<"<p>";
em(s,1,0);
link(s,0,1);
cout<<s;
flag3=1;
}
}
}
if(flag3)
{
cout<<"</p>"<<endl;
flag3=0;
}
if(flag2==0)
{
cout<<"</ul>"<<endl;
flag2=1;
}
return 0;
}