你的任务是模拟洪水灾害。
对于给定的横截面图,给出淹没部分的面积。
假设该地区不断地下雨,而从该地区溢出的水正在落入两侧的海中。 例如,对于上面的横截面图,雨水将产生洪水,其面积分别为 4、2、1、19 和 9。
输入
在一行中给出一个字符串,分别用/
,\
和_
表示斜坡和平原。
例如,上面例子的区域由字符串“\ \ / / / \ _ / \ / \ \ \ \ / _ / \ \ / / / _ _ \ \ \ _ \ \ / _ \ / _ / ”给出。
输出
按以下格式输出:
AK
L1,L2,…,Lk
在第一行,打印出洪水区域的总面积A。
在第二行,打印出洪水区域的个数K和每个区域的面积Li(从左到右)。
约束
1 ≤ length of the string ≤ 20000
输入样例
\\///\_/\/\\\\/_/\\///__\\\_\\/_\/_/\
输出样例
35 5 4 2 1 19 9
# include <iostream>
# include <stack>
# include <string>
# include <vector>
# include <algorithm>
using namespace std;
int main()
{
string str;
stack<int> s;
stack<pair<int,int> > ss;
vector<int> A;
int l,i,sum=0;
cin>>str;
l=str.size();
for(i=0;i<l;i++)
{
if(str[i]=='\\') //所有'\'简单入栈
{
s.push(i);
}
else if(str[i]=='/'&&s.size()!=0) //s.size()大于0表示左边有与之配对的'\' ,成为洪水区域的一部分
{
int j=s.top(); //j是 配对的'\'的位置
s.pop();
sum=sum+i-j; //sum为洪水区域的总面积
int a=i-j; // 配对的'\'和'/'之间的面积
while(ss.size()>0&&ss.top().first>j) //与下面的洪水区域合并
{
a=a+ss.top().second;
ss.pop();
}
ss.push(make_pair(j,a));
}
}
cout<<sum<<endl;
//ss栈里存放了从右到左的多个洪水区域
while(ss.size()>0)
{
A.push_back(ss.top().second);
ss.pop();
}
reverse(A.begin(),A.end());
cout<<A.size();
for(int k=0;k<A.size();k++)
{
cout<<" "<<A[k];
}
return 0;
}