小鱼儿吐泡泡,嘟嘟嘟冒出来。小鱼儿会吐出两种泡泡:大泡泡"O",小泡泡"o"。 两个相邻的小泡泡会融成一个大泡泡,两个相邻的大泡泡会爆掉。 例如:ooOOoooO经过一段时间以后会变成oO。
输入描述:
数据有多组,处理到文件结束。 每组输入包含一行仅有'O'与'o'组成的字符串。
输出描述:
每组输出仅包含一行,输出一行字符串代表小鱼儿吐出的泡泡经过融合以后所剩余的泡泡。
输入
ooOOoooO
输出
oO
说明
自左到右进行合并
备注:
对于100%的数据, 字符串的长度不超过100。
分析:
可以用数组模拟来处理,从左至右依次处理。
情况分析:
1.空,即tt<hh,此时可直接将s[i]入栈。
2. 如果hh<=tt,需判断是否有变化,如果sta[tt]是大气泡,并且是s[i]也是大气泡,则出栈,模拟气泡爆掉的过程,如果sta[tt]是小气泡,且s[i]也是小气泡,则先出栈,需判断栈内倒数第二个入栈的是否为大气泡,如果是,还需出栈,否则直接入栈。
3.输出,则通过hh输出,限制条件为hh<=tt
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve()
{
string s;
while(cin>>s)
{
ll hh=0,tt=-1;
char sta[500];
for(ll i=0;i<s.size();i++)
{
if(hh>tt)
{
sta[++tt]=s[i];
}
else
{
if(sta[tt]=='O'&&s[i]=='O')
{
tt--;
}
else if(sta[tt]=='o'&&s[i]=='o')
{
tt--;
if(hh>tt)
{
sta[++tt]='O';
}
else if(sta[tt]=='O')
tt--;
else
sta[++tt]='O';
}
else
sta[++tt]=s[i];
}
}
while(tt>=hh)
{
cout<<sta[hh];
hh++;
}
cout<<'\n';
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}