HDU 4782 Beautiful Soup --模拟
题意: 将一些分散在各行的HTML代码整理成标签树的形式。
解法: 模拟,具体见代码的讲解。 开始没考虑 '\t' 。。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std; string S,tmp,pre; int main()
{
int t,i,j,cs = ;
scanf("%d",&t);
getchar();
pre = "";
while(t--)
{
S = "";
int fir = ; //是否是第一个子串
while()
{
getline(cin,tmp,'\n');
if(fir) { tmp = pre + tmp; S = S + tmp; fir = ; } //如果是第一个子串,看有没有遗留在前面case的部分
else S = S + " " + tmp;
int ls = S.length();
int lt = tmp.length();
int tag = ;
for(i=;i<=lt-;i++) //读入
{
if(tmp.substr(i,) == "</html>")
{
S = S.substr(,ls-lt+i+);
pre = tmp.substr(i+,lt-i-);
tag = ;
break;
}
}
if(!tag) break;
}
int len = S.length(), deep = ;
printf("Case #%d:\n",cs++);
for(i=;i<len;i++) if(S[i] == '\t') S[i] = ' '; //把Tab转换掉
//cout<<"S = "<<S<<endl;
for(i=;i<len;i++)
{
if(S[i] == '<') //标签部分
{
if(S[i+] != '/') deep++; // 1.开标签,深度+
else deep--; // 2.闭标签,深度-
for(j=;j<deep-(S[i+]=='/'?:);j++) printf(" "); //如果是闭标签,不用减一个空格,否则要建一个空格输出,因为开始就deep++了
if(S[i+] != '/') //如果是类似 <hr/> 的空标签,deep--抵消开标签的deep++
{
for(j=i;S[j]!='>' && j < len;j++);
if(S[j-] == '/') deep--;
}
for(i;S[i]!='>';i++) cout<<S[i]; //输出标签内容
cout<<">"<<endl;
}
else //正文部分,空格地方小心处理
{
string buf = ""; //缓冲部分
int letter = ;
while(S[i] != '<' && i < len)
{
if(S[i] == ' ') //除掉文字前面的空格
{
while(S[i] == ' ' && i < len) i++;
i--;
}
if(S[i] == ' ' && (S[i+] == '<' || !letter)) { i++; continue; } //如果文本全是空格,i++,继续
letter = ; //否则,有字母
buf += S[i]; //推进缓冲区
i++;
}
if(letter) //如果文本有内容
{
for(j=;j<deep;j++) printf(" "); //再打deep个空格
cout<<buf; //输出缓冲区内容
puts("");
}
i--;
}
}
}
return ;
}
HDU 4782 Beautiful Soup --模拟的更多相关文章
- hdu - 4782 - Beautiful Soup(模拟)
题意:输出一堆乱排版的html标签,去多余空字符,转换为按缩进输出. 题目链接:pid=4782">http://acm.hdu.edu.cn/showproblem.php?pid= ...
- HDU 4782 Beautiful Soup (模拟+注意细节)
思路就是用栈模拟,不用开实体的栈,直接记一个top指针就行. 说说这题的细节: 1.tag标签里的内容不要动,原样输出.比如<p aa bb cc>,就这样输出就行,不要删空格.题目中说了 ...
- hdu 4782 Beautiful Soupz
模拟.其实这题就是题目比较长而已...读完题目就差不多了.tag直接读就可以了,题目说了不用修改.然后整个题目就是让求text部分,严格按空格分开.注意每行前面空格个数. #include<al ...
- python爬虫之Beautiful Soup的基本使用
1.简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索 ...
- 100天搞定机器学习|Day21 Beautiful Soup
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
- 爬虫---Beautiful Soup 反反爬虫事例
前两章简单的讲了Beautiful Soup的用法,在爬虫的过程中相信都遇到过一些反爬虫,如何跳过这些反爬虫呢?今天通过知乎网写一个简单的反爬中 什么是反爬虫 简单的说就是使用任何技术手段,阻止别人批 ...
- 使用Beautiful Soup编写一个爬虫 系列随笔汇总
这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...
- 网络爬虫: 从allitebooks.com抓取书籍信息并从amazon.com抓取价格(1): 基础知识Beautiful Soup
开始学习网络数据挖掘方面的知识,首先从Beautiful Soup入手(Beautiful Soup是一个Python库,功能是从HTML和XML中解析数据),打算以三篇博文纪录学习Beautiful ...
- Python爬虫学习(11):Beautiful Soup的使用
之前我们从网页中提取重要信息主要是通过自己编写正则表达式完成的,但是如果你觉得正则表达式很好写的话,那你估计不是地球人了,而且很容易出问题.下边要介绍的Beautiful Soup就可以帮你简化这些操 ...
随机推荐
- Follow me to learn what is repository pattern
Introduction Creating a generic repository pattern in an mvc application with entity framework is th ...
- ArcGIS制图之Sub Points点抽稀
简介 Sub Points工具是 Esri 中国自主开发的一个插件,该工具优先考虑点在空间分布上的均匀合理性,并结合点数据中包含的 "优先级" 属性进行筛选.通过获取每个点在一定范 ...
- andriod CheckBox
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout android:orientatio ...
- Java中的守护线程和非守护线程(转载)
<什么是守护线程,什么是非守护线程> Java有两种Thread:"守护线程Daemon"(守护线程)与"用户线程User"(非守护线程). 用户线 ...
- 我在用的mac软件(1)--终端环境之iTerm2
之前一直有朋友要我分享下在用的mac软件,今天有空就来写一下,可能不止于软件,会有一些配置或者工具,或者叫环境更合适.有些可能一句话带过,有些会详细介绍.也不分类了,想到哪个就写出来.如果已经写的足够 ...
- Android WebView 获取网页的标题
final TextView txtTitle = (TextView) findViewById(R.id.txtTitle); final WebView webView = (WebView)f ...
- 异步get请求之代理方法
#import "ViewController.h" #import "Header.h" @interface ViewController ()<NS ...
- 【转】IOS屏幕旋转与View的transform属性之间的关系,比较底层
iTouch,iPhone,iPad设置都是支持旋转的,如果我们的程序能够根据不同的方向做出不同的布局,体验会更好. 如何设置程序支持旋转呢,通常我们会在程序的info.plist中进行设置Suppo ...
- 多线程基础(二)pthread的了解
IOS中多线程的实现方案 了解NSOperation(代码) 所有的方法都是pthread开头的 然后再搞一条线程 pthread_create方法有返回值,作用:判断线程创建是否成功? ...
- Requirejs2.0笔记
API http://requirejs.org/ RequireJS 插件 http://requirejs.org/docs/api.html#plugins ①require.js脚本的异步加载 ...