CSP-201703-3Markdown

Markdown题目的详细信息(传送门)

  这个题目本身难度不是很大,但是但是有一些注意的细节,只需要将string的方法运用熟练,接这道题是没有多大的难度的,首先我给大家提供了一组测试数据,如果这个可以通过,基本上就不会存在扣分的问题。

输入样例:

* peare1
# _Heading_
##### Heading

## Sub-heading

Paragrapha are separated
_A_ [link](http://exaup1e.com)
by a blank line.

Text attributes _italic_.
* applea
* orangea
* peare2

* peare3

_A_ [link](http://exaup1e.com)
123

* peare4

输出样例:

<ul>
<li>peare1</li>
</ul>
<h1><em>Heading</em></h1>
<h5>Heading</h5>
<h2>Sub-heading</h2>
<p>Paragrapha are separated
<em>A</em> <a href="http://exaup1e.com">link</a>
by a blank line.</p>
<p>Text attributes <em>italic</em>.</p>
<ul>
<li>applea</li>
<li>orangea</li>
<li>peare2</li>
</ul>
<ul>
<li>peare3</li>
</ul>
<p><em>A</em> <a href="http://exaup1e.com">link</a>
123</p>
<ul>
<li>peare4</li>
</ul>

  还有需要注意的一点是对无序列表的处理,我第一次提交的时候只有50分,原因就是没有考虑列表在第一行,最后一行,以及两个列表挨在一起的情况,一下是满分代码:

#include <bits/stdc++.h>

using namespace std;

void trim(string &s){//此函数是将一个字符串的首尾空格删掉
	if(!s.empty()){
    	s.erase(0,s.find_first_not_of(" "));
    	s.erase(s.find_last_not_of(" ") + 1);
 	}
}

int main(){

	vector<string> vet;
	string line;
	
	int i = 0;int j = 0;//i和j判断p标签是否分段,以及多个无序列表是否相邻
	int ul = 1;         //判断ul是否完整,0的话还差一个结尾,1的话是完整的
	while(getline(cin,line)){
		ul = 1;
		/*
            先处理行内样式,每次都会用到,不分类;
		*/
     	if(line.length() > 0){
			while(line.find('_') != string::npos){  //处理斜体(<em></em>)一行可能有多个,所以加一个循环
				line.replace(line.find('_'),1,"<em>");
				line.replace(line.find('_'),1,"</em>");
			}

			while(line.find('[') != string::npos){  //处理连接a标签([link])一行可能有多个,所以加一个循环
				line.replace(line.find(']'),1,"</a>");
				
				int start = line.find('(');
				line.erase(line.begin()+start);
				int end = line.find(')');
				string ss = line.substr(start,end-start);
				line.erase(start,end-start+1);
				string s = "<a href=\"" + ss + "\">";

				line.replace(line.find('['),1,s);
			}

			/*
                处理区块
			*/
			if(line[0] == '*' || (vet.size()>1 && vet[vet.size()-1].find("<li>") != string::npos)){//先处理无序列表*
				string s = line.substr(1);
				trim(s);
				if(vet.size()>0 && vet[vet.size()-1].find("<li>") != string::npos){//不是第一个,处理
					if(line[0] != '*'){
						ul = 1;
						vet.push_back("</ul>");
					}else{
						if(j+1 != i){       //如果两个无序标签挨着,(有空行也算挨着),先这样处理
							vet.push_back("</ul>");
							vet.push_back("<ul>");
						}
						ul = 0;
						vet.push_back("<li>" + s + "</li>");
					}
				}else{      //第一个,直接处理
					vet.push_back("<ul>");
					vet.push_back("<li>" + s + "</li>");
					ul = 0;
				}
			}
			if(line[0] == '#'){     //处理标题
				int start = line.find(' ');
				stringstream s;s << start;string num = s.str();//将数字start转化为字符串num
				string str = line.substr(start);
				trim(str);
				str = "<h" + num + ">" + str + "</h" + num + ">";
				vet.push_back(str);
			}else if(line[0] != '*'){   //处理文章样式,p标签
				if(j+1 == i  && vet[vet.size()-1].find("</p>") != string::npos){//文章分行的时候
					string str = vet[vet.size()-1];
					vet[vet.size()-1] = str.substr(0,str.size()-4);
					vet.push_back(line + "</p>");
				}else{  //只有一行
					vet.push_back("<p>" + line + "</p>");
				}
			}
     		j = i;
		}
		i++;
		if(i == 21){//这是为了检测自己写的是否正确,你想输入几行,这就写i == 多少
			break;
		}
	}



	for(int k = 0; k < vet.size(); k++){
		cout << vet[k] << endl;
	}

	//如果这是最后一行,无序列表需要加入后面的标签</ul>
	if(ul != 1){
		cout << "</ul>";
	}
	return 0;
}

这里是题目O(∩_∩)O,欢迎大家留言,有空的话可以点个赞哦(#^ . ^#)

          试题编号:
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 语法,你的程序不需要考虑语法错误的情况。

      •   每个测试点包含的语法规则如下表所示,其中“√”表示包含,“×”表示不包含。
      提示
发布了42 篇原创文章 · 获赞 40 · 访问量 985

猜你喜欢

转载自blog.csdn.net/weixin_44635198/article/details/104430518