题意:输出一堆乱排版的html标签,去多余空字符,转换为按缩进输出。

题目链接:

pid=4782">http://acm.hdu.edu.cn/showproblem.php?pid=4782

——>>2013年成都区赛题目。当时挺多做不出最后一题的队伍做出了此题,而我,无限WA到比赛结束。。

今天。我AC了。。

题目中有一句话很重要:you shouldn’t change anything of any tag.

想想规范化后的标签,仅仅有两种方式开头,一种是标签 < 开头,还有一种是文本开头。。每种开头分别相应一种结尾。。

于是,读标签<xxx>时一直读到标签尾。

读文本时一直读到文本尾。。

最后,就AC吧。。

  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. const int MAXN = 200;
  5. const char* stop = "</html>";
  6.  
  7. char ch;
  8.  
  9. bool IsSpace(char ch)
  10. {
  11. return ch == 32 || ch == 9 || ch == 10;
  12. }
  13.  
  14. void PrintSpace(int n)
  15. {
  16. while (n--)
  17. {
  18. putchar(' ');
  19. }
  20. }
  21.  
  22. void RemoveSpace()
  23. {
  24. while ((ch = getchar()) && IsSpace(ch));
  25. }
  26.  
  27. void Enter()
  28. {
  29. putchar('\n');
  30. }
  31.  
  32. void GetEntireTag(char* tag)
  33. {
  34. int len = 0;
  35. tag[len++] = '<';
  36. while ((ch = getchar()) && ch != '>')
  37. {
  38. tag[len++] = ch;
  39. }
  40. tag[len++] = '>';
  41. tag[len] = '\0';
  42. }
  43.  
  44. void OutputTag(const char* tag, const int& spaceCnt)
  45. {
  46. if (tag[1] == '/')
  47. {
  48. PrintSpace(spaceCnt - 1);
  49. }
  50. else
  51. {
  52. PrintSpace(spaceCnt);
  53. }
  54. puts(tag);
  55. }
  56.  
  57. void UpdateSpace(const char* tag, int& spaceCnt)
  58. {
  59. int len = strlen(tag);
  60.  
  61. if (tag[1] != '/' && tag[len - 2] != '/')
  62. {
  63. ++spaceCnt;
  64. }
  65. else if (tag[1] == '/')
  66. {
  67. --spaceCnt;
  68. }
  69. }
  70.  
  71. void GetAndOutputEntireText(const int& spaceCnt)
  72. {
  73. PrintSpace(spaceCnt);
  74. putchar(ch);
  75. while ((ch = getchar()) && ch != '<')
  76. {
  77. if (IsSpace(ch))
  78. {
  79. RemoveSpace();
  80. if (ch == '<') break;
  81. else
  82. {
  83. PrintSpace(1);
  84. putchar(ch);
  85. }
  86. }
  87. else
  88. {
  89. putchar(ch);
  90. }
  91. }
  92. Enter();
  93. }
  94.  
  95. int main()
  96. {
  97. int T, kase = 0;
  98. char tag[MAXN];
  99.  
  100. scanf("%d", &T);
  101. getchar();
  102. while (T--)
  103. {
  104. int spaceCnt = 0;
  105.  
  106. ch = getchar();
  107. printf("Case #%d:\n", ++kase);
  108. while (true)
  109. {
  110. if (IsSpace(ch))
  111. {
  112. RemoveSpace();
  113. }
  114. else if (ch == '<')
  115. {
  116. GetEntireTag(tag);
  117. OutputTag(tag, spaceCnt);
  118. if (strcmp(tag, stop) == 0) break;
  119. UpdateSpace(tag, spaceCnt);
  120. ch = getchar();
  121. }
  122. else
  123. {
  124. GetAndOutputEntireText(spaceCnt);
  125. }
  126. }
  127. }
  128.  
  129. return 0;
  130. }

hdu - 4782 - Beautiful Soup(模拟)的更多相关文章

  1. HDU 4782 Beautiful Soup --模拟

    题意: 将一些分散在各行的HTML代码整理成标签树的形式. 解法: 模拟,具体见代码的讲解. 开始没考虑 '\t' .. 代码: #include <iostream> #include ...

  2. HDU 4782 Beautiful Soup (模拟+注意细节)

    思路就是用栈模拟,不用开实体的栈,直接记一个top指针就行. 说说这题的细节: 1.tag标签里的内容不要动,原样输出.比如<p aa bb cc>,就这样输出就行,不要删空格.题目中说了 ...

  3. hdu 4782 Beautiful Soupz

    模拟.其实这题就是题目比较长而已...读完题目就差不多了.tag直接读就可以了,题目说了不用修改.然后整个题目就是让求text部分,严格按空格分开.注意每行前面空格个数. #include<al ...

  4. python爬虫之Beautiful Soup的基本使用

    1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...

  5. 100天搞定机器学习|Day21 Beautiful Soup

    前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...

  6. 爬虫---Beautiful Soup 反反爬虫事例

    前两章简单的讲了Beautiful Soup的用法,在爬虫的过程中相信都遇到过一些反爬虫,如何跳过这些反爬虫呢?今天通过知乎网写一个简单的反爬中 什么是反爬虫 简单的说就是使用任何技术手段,阻止别人批 ...

  7. 使用Beautiful Soup编写一个爬虫 系列随笔汇总

    这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...

  8. 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup

    开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...

  9. Python爬虫学习(11):Beautiful Soup的使用

    之前我们从网页中提取重要信息主要是通过自己编写正则表达式完成的,但是如果你觉得正则表达式很好写的话,那你估计不是地球人了,而且很容易出问题.下边要介绍的Beautiful Soup就可以帮你简化这些操 ...

随机推荐

  1. linux下IPTABLES配置详解 (防火墙命令)

    linux下IPTABLES配置详解 -A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 24000 -j ACCEPT ...

  2. JDBC连接池(数据源)

    自定义连接池:用装饰设计模式将原连接的close方法改造成将连接还回数据源:装饰设计模式:http://www.cnblogs.com/tongxuping/p/6832518.html: 开源数据库 ...

  3. Bot Framework测试

    在开发完成Bot Framework后,在本机的模拟器都是成功的,但未知在发布后会出现什么样的问题,所以需要将本机发布的站点给到Bot 1.在Bot Framework注册一个Bot,打开Bot Fr ...

  4. centos6.5 卸载adobeflash

    # rpm -e flash-plugin # rpm -qa | grep ^flash-plugin

  5. Ubuntu 14.04 安装JDK 8

    1.安装JDK,参考 1.下载 JDK 8 从http://www.oracle.com/technetwork/java/javasebusiness/downloads/选择下载JDK的最新版本 ...

  6. Lock wait timeout exceeded数据库死锁问题

    环境 MySQL5.5 现象 A.数据更新或新增后数据经常自动回滚. B.表操作总报 Lock wait timeout exceeded 并长时间无反应 解决方法 A.应急方法:show proce ...

  7. ganglia笔记:rrd数据库

    为了给ganglia监控的数据加上报警的功能,在jenkins里加了一个定时job,运行报警的脚本.脚本需要对ganglia记录的数据进行分析,以下是一点粗浅的理解. rrdtool的本质是用于画图的 ...

  8. 队列 P1160 队列安排(啊啊 不会啊)

    洛谷 题目描述 一个学校里老师要将班上N个同学排成一列,同学被编号为1-N,他采取如下的方法: 1.先将1号同学安排进队列,这时队列中只有他一个人: 2.2-N号同学依次入列,编号为i的同学入列方式为 ...

  9. 【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子

    http://wenku.baidu.com/view/8f1fde586edb6f1aff001f7d.html #include<cstdio> #include<queue&g ...

  10. [TC-FindingFriends]Finding Friends

    题目大意: 给定一个长度为$n(n\le10^5)$的数列$A(A_i\le10^9)$,求最小的$k$满足存在一个长度至少为$m(m\le n)$的子串,对于串中的每一个数$A_i$,都至少存在一个 ...