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天搞定机 ...
随机推荐
- mysql substring_index()查询某个字符中以某个分割符分割后的值
substring_index(某个字段,以其分割,第几个分割点之前的值); +---------------------------------------------------------+ | ...
- Redis工具之Jedis
//jedis的连接池 public void test1(){ //创建连接池配置对象 JedisPoolConfig poolConfig = new JedisPoolConfig(); poo ...
- Java常用的正则校验
1.非负整数: (^[1-9]+[0-9]*$)|(^[0]{1}$) 或 (^[1-9]+[0-9]*$)|0 2.非正整数: (^-[1-9]+[0-9]*$)|(^[0]{1}$) 或 (^-[ ...
- angularjs1+requirejs+ bootstrap+ jQuery低版本配合兼容ie8+浏览器
angularjs兼容低版本IE浏览器(IE8)angularjs在1.3之后的版本都是选择放弃对IE8及更低IE版本的支持,但是就目前的开发形式来看,IE8的使用客户还是蛮多的,最近有个项目要求尽量 ...
- vue项目苹果微信端使用this.$router.go(-1)返回上一页,上一页并不会重新加载的问题
window.addEventListener('pageshow', function(e) { // 通过persisted属性判断是否存在 BF Cache if (e.persisted) { ...
- Java OOP——第二章 继承
1. 继承: ●继承是面向对象的三大特征之一,是JAVA实现代码重用的重要手段之一: ●继承是代码重用的一种方式,将子类共有的属性和行为放到父类中: ●JAVA只支持单继承,即每一个类只有一个父类,继 ...
- vue服务端渲染浏览器端缓存(keep-alive)
在使用服务器端渲染时,除了服务端的接口缓存.页面缓存.组建缓存等,浏览器端也避免不了要使用缓存,减少页面的重绘. 这时候我们就会想到vue的keep-alive,接下来我们说一下keep-alive的 ...
- mysql 5.7 配置初始化及修改 ROOT 用户密码
1.修改配置文件 my.ini 放在 mysql\bin [mysqld] basedir=C:\Mysql datadir=C:\Mysql\data port=3306 # server_id = ...
- python3 练习题100例 (二十七)列表元素改写
题目内容: 输入一个列表alist,要求列表中的每个元素都为正整数且不超过10: 将列表中的奇数变为它的平方,偶数除以2后打印新的列表(新的列表中所有元素仍都为整数). 可以使用以下实现列表alist ...
- python字符串编码
python默认编码 python 2.x默认的字符编码是ASCII,默认的文件编码也是ASCII. python 3.x默认的字符编码是unicode,默认的文件编码是utf-8. 中文乱码问题 无 ...