看到这道题时我的内心是奔溃的,没有了解过HTML,只能靠窝的渣渣英语一点一点翻译啊TT、
Information Extraction
题意:(纯手工翻译,有些用词可能在html中不是一样的,还多包涵)
从HTML文档中提取信息,用一种特殊的格式输出。
HTML文件的定义如下:
HTML:
是一种超文本标记语言。标记语言是由一系列的标记组成的。
标签描述文档内容。HTML文件由标签和文本组成。
标签:
HTML使用标签来实现他的语法。
标签由特殊的字符(如: ‘<’, ‘>’ and ‘/’)组成。
标签通常成对出现,起始标签和结束标签。起始标签以<开头,>结尾。
结束标签以</开头,以>结尾。文件的其他地方不会出现尖括号。
标签名是只含有小写字母的字符串。标签中没有行中断。
除了标签,文件中出现的其他东西都被认为是文本内容。
标签名的长度不超过30.
元素:
元素是起始标签和相对应的终止标签之间的任何内容,包括标签在内。
元素内容是开始标签和结束标签之间的内容。
有些元素没有内容,我们叫它空元素,如 <hr></hr>。
空元素可以被关在一个打开标签内,以/>结尾,而不是>。
所有元素都可以被关闭用关闭标签或者在开始标签里面。
元素可以有属性。
元素可以被嵌套,即一个元素可以包含另一个元素。
<html>元素师其他所有元素的容器,他不包含任何属性。
属性:
属性为元素提供额外信息。
属性总是在开始标签中被规定,在标签名的后面。
标签名和属性由一个空格隔开。
一个元素可以有多个属性。
属性以这样的形式出现:name="value" class="icpc",等号两边没有空格。
所有的属性名都是小写的。
id属性的值是唯一的,长度小于等于30.
题目中还给了几个例子,我们来看一下:
sample 1:
<html><body> //<html>是总容器,<body>是标签
<h3 id="header" class="style1">this is a test</h3> //<h3 id="header" class="style1">是起始标签,标签名是h3,有两个属性,id和class。“this is a test”是元素。</h3>是结束标签。
<div id="content" class="style2"> //<div> 标签,同上。
this is content<br/>
<pre>var x = 1111; </pre>
</div>
</body></html> //结束标签
由结构到输出格式的映射如下:
id属性的值-输出格式的标签名
输入:
T:代表有几组样例。
每一个样例都在前面规定它的输出格式。
n:有几种html文件
每一种类型的l结构在之前的html文件中
m: 有几种映射从结构到输出结果
m行映射
最后是html测试案例
输出:
每一组样例,第一行输出“Case #x”
如果存在这种结构的html文件,按格式输出,否则,输出“Can't Identify”如果有多种结构,使用最早输入的结构。
下面我们来分析一样题目给出的测试数据:
input:
2 <news> <title>default title</title> <content width="1000px"></content> </news> 1 <html><h3 id="header"></h3> <div id="content"></div></html> 2 header-title content-content <html><h3 id="header" class="style1"> this is a test</h3> <div id="content" class="style2"> this is content<br/> <pre>var x = 1111;</pre> </div> </html> <xxx> <title>default title</title> </xxx> 1 <html><h3 id="header"></h3></html> 1 header-title <html><h3 id="tmp">xxxx</h3></html>
output:
Case #1: <news> <title> this is a test</title> <content width="1000px"> this is content<br/> <pre>var x = 1111;</pre> </content> </news>
Case #2: Can't Identify
输入分析:
蓝色部分规定了输出格式,绿色部分规定了html文件的结构,红色部分为m种映射,紫色部分是需要提取信息的文本。
拿case 1 来看,<html><h3 id="header" class="style1"> this is a test</h3> <div id="content" class="style2"> this is content<br/> <pre>var x = 1111;</pre> </div> </html> 从中我们可以得出的信息为 标签h3,它的属性id的值为header,上述header的映射为title,所以用标签为title 的格式输出“<title> this is a test</title>” 接下来是div标签,它的属性id的值为content,上述content的映射为content,所以用标签为content的格式输出“ <content width="1000px"> this is content<br/> <pre>var x = 1111;</pre> </content>”,在前后分别加上<news></news>;
case 2:找不到属性值为tmp的映射,所以不能定义。
题意,样例都说完了,下面来看看代码吧(不是本人写的):
1 #include<iostream> 2 #include<cstdio> 3 #include<string.h> 4 using namespace std; 5 const int N=10010; 6 const int M=35; 7 char html[M][N],stored[M][N],sta1[N][M]; 8 char mapping[M][M][2][M];//存储映射情况 9 int mapNum[M],sta2[N]; 10 void getHtmlFormat(int n)//读取html的格式 11 { 12 int j,i=0,flag=1; 13 char beginTag[M];//存储开始标签 14 char tag[M];//存储标签 15 getchar(); 16 while(1) 17 { 18 html[n][i]=getchar();//读取第n个html 19 if(html[n][i]=='<') 20 { 21 j=0; 22 while(html[n][++i]=getchar()) 23 { 24 if(html[n][i]=='/') 25 continue; 26 if(html[n][i]==' '||html[n][i]=='>') 27 break; 28 tag[j++]=html[n][i]; 29 } 30 tag[j]='