Your task is to simulate a flood damage.

For a given cross-section diagram, reports areas of flooded sections.

Assume that rain is falling endlessly in the region and the water overflowing from the region is falling in the sea at the both sides. For example, for the above cross-section diagram, the rain will create floods which have areas of 4, 2, 1, 19 and 9 respectively.

Input

A string, which represents slopes and flatlands by '/', '\' and '_' respectively, is given in a line. For example, the region of the above example is given by a string "\\///\_/\/\\\\/_/\\///__\\\_\\/_\/_/\".

output

Report the areas of floods in the following format:

A
k L1 L2 ... Lk

In the first line, print the total area A of created floods.

In the second line, print the number of floods kk and areas Li(i=1,2,...,k) for each flood from the left side of the cross-section diagram. Print a space character before Li.

Constraints

  • 1≤ length of the string ≤20,000

Sample Input 1

\\//

Sample Output 1

4
1 4

Sample Input 2

\\///\_/\/\\\\/_/\\///__\\\_\\/_\/_/\

Sample Output 2

35
5 4 2 1 19 9 附上AC代码,至于在解这道题的过程中遇到的许多问题,在代码中都写有注释:

#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;
const int maxn=2e4+10;
// 本来不想用结构体,对于这种两个绑定的,可以用pair,可是用pair之后发现程序运行的很不成功,以为是pair用错了语法,
// 毕竟c++我暂时是自学,pair也是只要从网上看的,于是就把pair改为了结构体,结果运行仍是很不成功,改了很久才发现真正的问题,
struct node //最后才知道pair没有用错,不过都写成结构体了,也就不再改为pair了
{
int first,second;
};
stack<struct node >s; //存储面积信息,位于字符串的第i位开始的'\',以其为最左边的拦截面积,存储的是,(i,si)
stack<int>q; //存储第几位是'\\'
char str[maxn]; //存储输入的三种字符
int main()
{
int i,j,sum=0;
scanf("%s",str);
for(i=0;str[i]!='\0';i++)
{
if(str[i]=='\\') q.push(i);
if(str[i]=='/')
{
if(!q.empty())
{
struct node s1;
s1.second=i-q.top();
sum+=s1.second;
s1.first=q.top();
q.pop();
if(!s.empty()) //之前没有判断这一步,包括下面的是否为空的判断也没有,就导致在第一次引用时,栈s肯定是空,但是我用了s.top(),所以会出错
{
while(1)
{ //这里是关键,判断能不能合并成一个拦截面积
if(!s.empty()&&s1.first<s.top().first) s1.second+=s.top().second,s.pop(); /* 在这里遇到了最后一个问题,我原先写的是
if(s1.first<s.top().first&&!s.empty())但是这么写仍旧程序运行不成功,然后检查bug时看到这里想起了以前看到过的if条件的判断,如果是||连接的,则从左到右判断,
若发现存在正确的条件之一时会直接显示正确,并且之后的条件不再进行检查,而&&则是如果遇见错误的条件之一时,直接判断为false,并且不再检查之后的条件,
如果按照我原先写的,当栈为空时,我却调用了top(),便会理所当然的出现与之前说的同一个问题,但是如果改为我现在写的AC的代码,先判断是不是空,如果是空,
则直接为false,并且不再进行之后的条件判断,便不会出现当栈为空时,仍掉用栈顶元素的现象 */
else {s.push(s1);break;}
}
}
else s.push(s1);
}
else continue;
}
}
int k=s.size();
printf("%d\n%d",sum,k);
int su[maxn];
for(int i=0;i<k;i++) //本来想用队列这种结构了,队列在这里的输出非常简单,可是不能调用队尾元素了(可能可以调用,但是我没遇见过),之前的代码就不能运行,所以就有改为了栈
su[i]=s.top().second,s.pop();
for(int i=k-1;i>=0;i--)
printf(" %d",su[i]);
cout<<endl; //本来没有这句话竟然显示PE,可是一直不明白为什么会有这句话,在题面中也没有写啊,最后还是凭借感觉写上了这句话,然后就AC了
return 0;
}

												

ALDS1_1_3_D Areas on the Cross-Section Diagram 遇见了几个有意思的语法问题的更多相关文章

  1. TS各个表 与 SECTION 的解析 CAS原理

    TS流,通过一个个的TS包来传送: TS包可以是传送PSI SI等各表的数据包,也可以是传送节目音视频数据(携带的PES包:音视频基本流包)的包:TS携带 PSI SI等表的数据时,各个表以各表对应的 ...

  2. Transistor 晶体管 场效应 双极型 达林顿 CMOS PMOS BJT FET

    Transistor Tutorial Summary Transistor Tutorial Summary Bipolar Junction Transistor Tutorial We can ...

  3. Circles and Pi

    Circles and Pi Introduction id: intro-1 For as long as human beings exist, we have looked to the sky ...

  4. Video processing systems and methods

    BACKGROUND The present invention relates to video processing systems. Advances in imaging technology ...

  5. allegro使用汇总 [转贴]

    1.如何在allegro中取消花焊盘(十字焊盘) set up->design parameter ->shape->edit global dynamic shape parame ...

  6. Computer Generated Angular Fisheye Projections [转]

    Computer GeneratedAngular Fisheye Projections Written by Paul Bourke May 2001 There are two main ide ...

  7. 每日英语:Risk-Averse Culture Infects U.S. Workers, Entrepreneurs

    Americans have long taken pride on their willingness to bet it all on a dream. But that risk-taking ...

  8. linux heads分析(转)

    内核默认的运行地址为PHY_OFFSET+0x8000,即物理地址开始后的0x8000字节处,前面是留给参数用的.参数以atag方式存储,默认放在0x100偏移位置. http://blog.chin ...

  9. BC in fluent

    Boundary conditions in Fluent Table of Contents 1. Boundary Conditions (BC) 1.1. Turbulence Paramete ...

随机推荐

  1. [2019杭电多校第一场][hdu6579]Operation(线性基)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6579 题目大意是两个操作,1个是求[l,r]区间子序列的最大异或和,另一个是在最后面添加一个数. 如果 ...

  2. 实现简单的计算器(设计UI)

    要点说明: 1.一个textedit控件,其余全部是button控件,button布局方式:栅格布局(Grid layout) 2.对窗体的Title进行修改(默认是工程名) 3.在ui文件中设计的U ...

  3. jdk 1.7 新增

    二进制整数 JDK7提供了二进制整数的类型,只要以0b开头即可.int a = 0b0101; 下划线分隔符 针对特别长的数字,读懂它令人头疼,这时候用下划线分割数字,可增加代码可读性.long a ...

  4. 云中沙箱学习笔记2-ECS之初体验

    1.1 背景知识 云服务器(Elastic Compute Service, 简称ECS),是一种简单高效,处理能力可以弹性伸缩的计算服务.ECS的相关术语说明如下: --实例(Instance):是 ...

  5. centos7卸载YUM后重装过程 -bash: yum: command not found / -bash: yum: 未找到命令

    [root@localhost ~]# rpm -qa |grep yum yum-3.4.3-158.el7.centos.noarch yum-plugin-fastestmirror-1.1.3 ...

  6. C++ CMake 入门实战[转载]

    C++ CMake 入门实战 2016-11-05 CMake用于跨平台的编译系统,对于通常的c/c++工程,都是通过make来进行编译的,CMake可以通过指令生成Makefile文件来指导整个项目 ...

  7. spring boot 加载指定xml

    方法一:使用@ImportResource 方法二:在test中 @ContextConfiguration(locations = "classpath:spring-profile.xm ...

  8. LNMP集群架构篇

    一.LNMP介绍 1.使前端web服务和后端存储服务进行串联 2.主要实现处理php动态请求 工作原理: L:linux  N:nginx  M:mysql   P:php 二.lnmp部署 我的环境 ...

  9. 1.Linux安装redis

    Linux安装redis 操作系统是Centos7 1.下载压缩包 2.解压 3.编译 4.启动redis 5.设置redis.conf和防火墙端口开放,外网可以访问 1.下载压缩包 下载地址:htt ...

  10. Java IO方式

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11444349.html BIO 传统的java.io包,它基于流模型实现,提供了我们最熟知的一些IO功 ...