HDU4782 Beautiful Soup

成都赛里的一道坑爹码力题,突然间脑抽想做一下弥补一下当时的遗憾。当时没做出这道题一是因为当时只剩大概45分钟,对于这样的具有各种条件的题无从下手,二则是因为当时估算着已经有银牌了,所以就不挣扎了。但是像这种题还是一定要敲一下的。

这学期学了编译原理,知道了一些在编译上处理这种题目的一些姿势,例如自动机,parse
tree什么的,所以写起来就会更清晰。其实说白了本题的难点在于tokenizer,就是将里面有意义的部分全部弄出来,归结起来可以看成4种,分别是opentag,closetag,blanktag,string,根据有无<>以及/的位置就可以确定下是属于哪一种。然后题目最麻烦的其实就正如它文末的那句,“You
quickly realize that your only job is to deal with the white
spaces.”

吃空格可以用下面的一句while解决  while((c=getchar)&&isSpace(c));
这样就可以得到第一个不是空格的字符,然后就是不停的吃后面的字符,当吃到空格或者是<的时候就表示到了一个分隔符,前面的字符串就可以先弄出来了。注意的是‘<’会作为下一个token的第一个字符,所以要加个save表示是否存起来。

tokenizer的机理大概是这样的。
首先要得到下一个token的第一个字符,如果save==true,表示已经有了,否则利用while((c=getchar)&&isSpace(c))吃出第一个非空字符。根据第一个字符类型判断是string还是tag,如果是tag就不停地吃直到吃到的字符是‘>‘,如果是string,就不停的吃吃到第一个分隔符。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

#pragma warning(disable:4996)

#include <iostream>

#include <cstring>

#include <string>

#include <cstdio>

using
namespace std;

#define maxn 1000000

#define INIT 0

#define OPENTAG 1

#define CLOSETAG 2

#define BLANKTAG 3

#define STRING 4

#define END 5

char
token[maxn];

int
cur;

int
tokenType;

int
lastType;

int
indent;

bool
save;

char
savechar;

bool
isSpace(char
c){

    return
c == ‘ ‘ || c == ‘   ‘
|| c == ‘\n‘;

}

bool
isdel(char
c){

    return
c == ‘ ‘ || c == ‘   ‘
|| c == ‘\n‘
|| c == ‘<‘;

}

void
printSpace()

{

    for
(int i = 0; i < indent; i++){

        putchar(‘ ‘);

    }

}

void
nextToken()

{

    char
c; cur = 0;

    if
(save){

        c = savechar; token[cur++] = c; save = false;

    }

    else{

        while
((c = getchar()) && isSpace(c));

        token[cur++] = c;

    }

    if
(token[0] == ‘<‘){

        while
((c = getchar())&&c!=‘>‘){

            token[cur++] = c;

        }

        token[cur++] = c;

        if
(token[cur - 2] == ‘/‘) tokenType = BLANKTAG;

        else
if (token[1] == ‘/‘) tokenType = CLOSETAG;

        else
tokenType = OPENTAG;

        token[cur++] = ‘\0‘; return;

    }

    else{

        while
((c = getchar()) && !isdel(c)){

            token[cur++] = c;

        }

        if
(c == ‘<‘){

            save = true; savechar = ‘<‘;

        }

        token[cur++] = ‘\0‘; tokenType = STRING;

    }

}

int
main()

{

    //freopen("in.txt", "r", stdin);

    //freopen("out.txt", "w", stdout);

    int
T; cin >> T; int
ca = 0; bool
endcase = false;

    indent = 0; lastType = INIT; save = false;

    while
(1)

    {

        if
(!endcase) {

            printf("Case #%d:\n", ++ca); endcase = true;

        }

        nextToken();

        if
(tokenType == OPENTAG){

            if
(lastType == STRING) puts("");

            printSpace();

            printf("%s\n", token);

            ++indent;

        }

        else
if (tokenType == CLOSETAG){

            if
(lastType == STRING) puts("");

            --indent;

            printSpace();

            printf("%s\n", token);

        }

        else
if (tokenType == BLANKTAG){

            if
(lastType == STRING) puts("");

            printSpace();

            printf("%s\n", token);

        }

        else{

            if
(lastType == STRING) putchar(‘ ‘);

            else
{

                printSpace();

            }

            printf("%s", token);

        }

        if
(strcmp(token, "</html>") == 0){

            endcase = false; lastType = INIT; indent = 0;

            if
(ca == T){

                break;

            }

        }

        lastType = tokenType;

    }

    return
0;

}

时间: 2024-08-30 15:08:13

HDU4782 Beautiful Soup的相关文章

HDU4782——Beautiful Soup(模拟)

题目大意 题目给你一些没有经过排版的HTML代码,让你按照一定的格式排版好,去掉多余空格,保持规则的缩进. 题目分析 注意的地方就是' < /html >' 和 '< html >' 可能在同一行. 其实题目本身并没有多少技巧,就是锻炼基本的代码功底.刚开始写的时候,写了一坨稀烂的代码,结果出错之后的Debug变得非常困难.所以看似这种随意的代码风格能节省时间,其实维护的成本要高得多得多.后来又重新敲了一遍,发现其实在你有了一个全局的规划之后再动手,代码会更加清晰,出错之后也更易发

[Python]HTML/XML解析器Beautiful Soup

[简介] Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.即HTML/XMLX的解析器. 它可以很好的处理不规范标记并生成剖析树(parse tree). 它提供简单又常用的导航(navigating),搜索以及修改剖析树的操作.它可以大大节省你的编程时间. [安装] 下载地址:点击打开链接 Linux平台安装: 如果你用的是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装: $ apt-get install Python-bs4 B

python标准库Beautiful Soup与MongoDb爬喜马拉雅电台的总结

Beautiful Soup标准库是一个可以从HTML/XML文件中提取数据的Python库,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式,Beautiful Soup将会节省数小时的工作时间.pymongo标准库是MongoDb NoSql数据库与python语言之间的桥梁,通过pymongo将数据保存到MongoDb中.结合使用这两者来爬去喜马拉雅电台的数据... Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是

HDU 4782 Beautiful Soup(模拟)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4782 Problem Description Coach Pang has a lot of hobbies. One of them is playing with "tag soup" with the help of Beautiful Soup. Coach Pang is satisfied with Beautiful Soup in every respect, except

爬虫学习——网页解析器Beautiful Soup

一.Beautiful Soup的安装与测试 官方网站:https://www.crummy.com/software/BeautifulSoup/ Beautiful Soup安装与使用文档:  https://www.crummy.com/software/BeautifulSoup/bs4/doc/ 1.首先测试一下bs4模块是否已经存在,若不存在再安装即可,我用的是kali测试发现bs4模块已经存在,下面介绍如何测试与安装 新建python文档输入以下代码 1 import bs4 2

Beautiful Soup的使用

Beautiful Soup简单实用,功能也算比较全,之前下载都是自己使用xpath去获取信息,以后简单的解析可以用这个,方便省事. Beautiful Soup 是用 Python 写的一个 HTML/XML 的解析器,它可以很好的处理不规范标记并生成剖析树.通常用来分析爬虫抓取的web文档.对于 不规则的 Html文档,也有很多的补全功能,节省了开发者的时间和精力. Beautiful Soup 的官方文档齐全,将官方给出的例子实践一遍就能掌握.官方英文文档,中文文档 一 安装 Beauti

2017.08.11 Python网络爬虫实战之Beautiful Soup爬虫

1.与Scrapy不同的是Beautiful Soup并不是一个框架,而是一个模块:与Scrapy相比,bs4中间多了一道解析的过程(Scrapy是URL返回什么数据,程序就接受什么数据进行过滤),bs4则在接收数据和进行过滤之间多了一个解析的过程,根据解析器的不同,最终处理的数据也有所不同,加上这一步骤的优点是可以根据输入数据的不同进行针对性的解析:同一选择lxml解析器: 2.安装Beautiful Soup环境:pip install beautifulsoup4 3.Beautiful

Python爬虫利器二之Beautiful Soup的用法

上一节我们介绍了正则表达式,它的内容其实还是蛮多的,如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Beautiful Soup,有了它我们可以很方便地提取出HTML或XML标签中的内容,实在是方便,这一节就让我们一起来感受一下Beautiful Soup的强大吧. 1. Beautiful Soup的简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官

推荐一些python Beautiful Soup学习网址

前言:这几天忙着写分析报告,实在没精力去研究django,虽然抽时间去看了几遍中文文档,还是等实际实践后写几篇操作文章吧! 正文:以下是本人前段时间学习bs4库找的一些网址,在学习的可以参考下,有点多,就不啰嗦了! 点击url左侧文字直接进入相关网页 点击url左侧文字直接进入相关网页 点击url左侧文字直接进入相关网页 BeautifulSoup使用总结:http://blog.chinaunix.net/uid-26722078-id-3519422.html Beautiful Soup