HDU 4782 Beautiful Soup (模拟+注意细节)
思路就是用栈模拟,不用开实体的栈,直接记一个top指针就行。
说说这题的细节:
1.tag标签里的内容不要动,原样输出。比如<p aa bb cc>,就这样输出就行,不要删空格。题目中说了you shouldn’t change anything of any tag.
2.标签之外的文本,文本内的空白符(空格,tab,回车),相邻单词之间用一个空格分隔开。文本与标签相邻的地方,不要有多余的空白符,就是说,文本与标签相邻的地方,除了一个回车以及缩进用的空白符之外,不要有任何空白符。
3.上一个case的</html>跟下一个case的<html>有可能在同一行,并且第一个<html>之前有可能有空白符
4.每行结尾不要有多余的空格
5.不要有空行
以下给出几组数据,空格用<SPACE>表示,tab键用<TAB>表示:
Input:
<TAB><html> <body>
<h1>ACM
ICPC</h1>
<p>Hello<br/>World</p>
</body></html>
<html> <body><p><TAB>
Asia Chengdu Regional </p><TAB>
<p class="icpc">
ACM-ICPC</p></body></html>
<html> <TAB>
<TAB>
</html><TAB><html>
<p>
<TAB>
aa bb cc dafdadgsdfsa<TAB> afd
</p>
<TAB> </html><TAB><TAB>
<html><body aslfja fdsafs<TAB>fdsafsa ><bb/></body></html>
Output
Case #:
<html>
<body>
<h1>
ACM ICPC
</h1>
<p>
Hello
<br/>
World
</p>
</body>
</html>
Case #:
<html>
<body>
<p>
Asia Chengdu Regional
</p>
<p class="icpc">
ACM-ICPC
</p>
</body>
</html>
Case #:
<html>
</html>
Case #:
<html>
<p>
aa bb cc dafdadgsdfsa afd
</p>
</html>
Case #:
<html>
<body aslfja fdsafs fdsafsa >
<bb/>
</body>
</html>
代码
#include <cstdio>
#include <cstring>
#include <cstdlib> #define IN 0
#define OUT 1 #define START 0
#define END 1 using namespace std; const int MAXN = ; char str[MAXN];
char tmp[MAXN];
char tag[MAXN]; bool CheckEnd( char *s, int len )
{
if ( s[len-] == '<' && s[len-] == '/' && s[len-] == 'h'
&& s[len-] == 't' && s[len-] == 'm' && s[len-] == 'l'
&& s[len] == '>' )
return true;
return false;
} int chuli( char *s, int len )
{
int i = , j = ;
while ( i < len && (s[i] == ' ' || s[i] == || s[i] == '\n') ) ++i;
while ( i < len )
{
s[j] = s[i];
if ( s[i] == '>' )
{
++i;
while ( s[i] == ' ' || s[i] == || s[i] == '\n' ) ++i;
}
else ++i;
++j;
}
s[j] = '\0';
return j;
} int DeleteSpace( char *s, int len )
{
int i = , j = ;
while ( i < len )
{
if ( s[i] == '<' )
{
if ( j - >= && ( s[j - ] == ' ' || s[j - ] == ) ) s[j - ] = s[i++];
while ( i < len && s[i] != '>' )
{
s[j++] = s[i++];
}
s[j++] = s[i++];
}
else if ( s[i] == ' ' || s[i] == )
{
s[j++] = ' ';
while ( i < len && ( s[i] == ' ' || s[i] == ) ) ++i;
}
else s[j++] = s[i++];
}
s[j] = '\0';
return j;
} void solved( char* s, int len )
{
//puts(s);
int top = ;
int i = ;
while ( i < len )
{
if ( s[i] == '<' )
{
int j = ;
while ( s[i] != '>' )
{
tag[j++] = s[i++];
}
tag[j++] = s[i++];
tag[j] = '\0'; if ( tag[] == '/' )
{
--top;
for ( int k = ; k < top; ++k )
putchar(' ');
}
else
{
for ( int k = ; k < top; ++k )
putchar(' ');
++top;
}
if ( tag[j-] == '/' ) --top;
puts(tag);
}
else
{
for ( int k = ; k < top; ++k ) putchar(' ');
while ( i < len && s[i] != '<' )
{
putchar(s[i]);
++i;
}
puts("");
}
}
return;
} int main()
{
int T, cas = ;
//freopen( "in.txt", "r", stdin );
//freopen( "s.txt", "w", stdout );
scanf( "%d", &T );
printf( "Case #%d:\n", ++cas );
int len = ;
while ( gets(tmp) != NULL )
{
strcpy( &str[len], tmp );
len += strlen(tmp);
str[len++] = ' ';
}
str[len - ] = '\0';
//puts(str); int j = ;
for ( int i = ; i < len; )
{
tmp[j++] = str[i++];
if ( j > && CheckEnd( tmp, j - ) )
{
tmp[j] = '\0';
--T;
//printf( "T = %d\n", T );
solved( tmp, DeleteSpace( tmp, chuli( tmp, j ) ) );
j = ;
if ( T ) printf( "Case #%d:\n", ++cas );
}
}
return ;
}
HDU 4782 Beautiful Soup (模拟+注意细节)的更多相关文章
- HDU 4782 Beautiful Soup --模拟
题意: 将一些分散在各行的HTML代码整理成标签树的形式. 解法: 模拟,具体见代码的讲解. 开始没考虑 '\t' .. 代码: #include <iostream> #include ...
- hdu - 4782 - Beautiful Soup(模拟)
题意:输出一堆乱排版的html标签,去多余空字符,转换为按缩进输出. 题目链接:pid=4782">http://acm.hdu.edu.cn/showproblem.php?pid= ...
- hdu 4782 Beautiful Soupz
模拟.其实这题就是题目比较长而已...读完题目就差不多了.tag直接读就可以了,题目说了不用修改.然后整个题目就是让求text部分,严格按空格分开.注意每行前面空格个数. #include<al ...
- 推荐一些python Beautiful Soup学习网址
前言:这几天忙着写分析报告,实在没精力去研究django,虽然抽时间去看了几遍中文文档,还是等实际实践后写几篇操作文章吧! 正文:以下是本人前段时间学习bs4库找的一些网址,在学习的可以参考下,有点多 ...
- 转:Beautiful Soup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时 ...
- python爬虫之Beautiful Soup的基本使用
1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...
- Beautiful Soup 学习手册
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式 快速开始 下面的一段HTML代码将作为例 ...
- Beautiful Soup 4.2.0 文档
Beautiful Soup 4.2.0 文档 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方 ...
- 100天搞定机器学习|Day21 Beautiful Soup
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
随机推荐
- JavaFXML实现新窗口打开
实现原理顺着往下看就明白了,流程看红色字体.具体还有什么问题可以留言. 主页面配置文件,一共三个按钮.这里说明第一个按钮触发打开新窗口 <?xml version="1.0" ...
- java中泛型的简单使用
泛型是在jdk1.5之后引入的,我们可以在类的声明处增加泛型列表,如:<T,E,V>.此处,字符可以是任何标识符,一般采用这3个字母. 1.泛型类声明 class MyCollection ...
- ios微信公众号分享回调事件
IOS手机在分享成功后,回调事件无法正常执行,在回调方法里面加入: setTimeout(function () { //todo }, ); 例如: //分享 Share({ title: &quo ...
- JavaScript 基础(二)数组
字符串, JavaScript 字符串就是用'' 和""括起来的字符表示. 字符字面量, \n 换行, \t 制表, \b 退格, \r 回车, \f 进纸, \\ 斜杠,\' 单 ...
- LVS NAT,DR,TUN三种负载原理
负载均衡简单介绍 用通俗的话来说负载均衡,就是通过不同的调度机制将用户的请求分派到后端不同的服务器.缓解服务器的请求压力,实现负载均衡的方案有多种,下面简单说说了解的几种方式: DNS 负载:利用DN ...
- jqGrid使用手册
JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情.jQgrid 使用详 ...
- winform窗体传值和动态添加控件
1.跳转窗体时传值 //将要显示的页面实例化 RoleMenuForm rmf = new RoleMenuForm(); try { //在此给RoleMenuForm 窗体中的变量roleId传值 ...
- python_day4_shopping
购物车例子,实现显示商品信息,输入商品编号并且可以减去自己的存入余额,当商品价格大于自己的余额的时候,直接退出:当不再选择商品的时候,退出显示余额和已经添加的商品. #购物车程序 product_li ...
- docker和docker compose常用操作命令
首先区分一下docker中几个概念 Image:镜像,相当于一个root文件系统,不包含任何动态数据 Container:容器,镜像运行时的实体,实质是进程,容器进程运行于属于自己的独立的命名空间 d ...
- IDEA Java Web(Spring)项目从创建到打包(war)
创建Maven管理的Java Web应用 创建新项目,"create new project",左侧类型选择"maven",右侧上方选择自己的SDK,点击&qu ...