思路就是用栈模拟,不用开实体的栈,直接记一个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 (模拟+注意细节)的更多相关文章

  1. HDU 4782 Beautiful Soup --模拟

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

  2. hdu - 4782 - Beautiful Soup(模拟)

    题意:输出一堆乱排版的html标签,去多余空字符,转换为按缩进输出. 题目链接:pid=4782">http://acm.hdu.edu.cn/showproblem.php?pid= ...

  3. hdu 4782 Beautiful Soupz

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

  4. 推荐一些python Beautiful Soup学习网址

    前言:这几天忙着写分析报告,实在没精力去研究django,虽然抽时间去看了几遍中文文档,还是等实际实践后写几篇操作文章吧! 正文:以下是本人前段时间学习bs4库找的一些网址,在学习的可以参考下,有点多 ...

  5. 转:Beautiful Soup

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时 ...

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

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

  7. Beautiful Soup 学习手册

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式   快速开始 下面的一段HTML代码将作为例 ...

  8. Beautiful Soup 4.2.0 文档

    Beautiful Soup 4.2.0 文档 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方 ...

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

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

随机推荐

  1. Spring知识点总结(一)

       1. 框架概述        所谓的框架其实就是程序的架子,在这个程序的架子中,搭建起程序的基本的骨架,针对程序的通用问题给出了便捷的解决方案,可以使开发人员 基于框架快速开发具体的应用程序.  ...

  2. Redis分布式锁的正确实现方式(Java版)

    前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介 ...

  3. SpringBoot非官方教程 | 第一篇:构建第一个SpringBoot工程

    转载请标明出处: https://www.fangzhipeng.com/springboot/2017/07/11/springboot1 本文出自方志朋的博客 简介 spring boot 它的设 ...

  4. Centos6.9 安装Oracle11gR2

    最近在学习怎么安装Centos,在Centos6.9版本安装Oracle数据库.参考了网络上很多文章,终于可以不报错的完成安装了,在这里记录一下 一.需要用到的安装文件 Centos6.9   ps: ...

  5. 安装VMware,出现没有虚拟网络适配器的问题

    遇到错误:安装VMware Workstation Pro这个软件,网络适配器中没有虚拟网卡,导致无法上网 解决方法:遇到这个问题,我就第一时间就去网上搜索解决方法,方案有很多,但是试了很多个还是不行 ...

  6. This system is registered to Red Hat Subscription Management, but is not receiving updates. You can use subscription-manager to assign subscriptions.

    Wrong date and time, reset the date and time in the system properly. It may also happen that system ...

  7. 路由器基础配置之ppp封装下的pap,chap认证

    我们将以上面的拓扑图完成本次实验,路由器的默认封装为HDLC,要求为把路由器全被更改为ppp封装,并在router3与router4之间用pap认证,在router4与router5之间用chap认证 ...

  8. html样式不兼容 详解(转)

    网站对火狐不兼容的原因以及解决的方法 1.DOCTYPE 影响 CSS 处理 2.FF: div 设置 margin-left, margin-right 为 auto 时已经居中, IE 不行 3. ...

  9. PHP-提升PHP性能的几个扩展

    下面介绍的几个扩展原理都是对OPCODE进行缓存(Opcode缓存原理查看http://www.cnblogs.com/JohnABC/p/4531029.html): Zend Opcache: 由 ...

  10. mysql 常用函数,基本使用

    1:选中排除表1 连接表2 表3 获取选中表1中部分选中表3 的部分 并且设置选中状态select t1.*,if(t2中t3id=t1.id,1,0)as checked from t1 lefet ...