#include <iostream>
#include <stack>
using namespace std;
// 判断栈顶的两个元素是否均为两个大泡泡O
bool isDelBig(stack<char>& astk) {
if (astk.size() <= 1) return false; // 如果栈中元素少于2,则返回false
char tem = astk.top();
if (tem != 'O') return false; // 如果栈顶不是大泡泡立刻返回fasle
astk.pop();
if (astk.top() == 'O') { // 第二个栈顶元素也是大泡泡,返回true
astk.push(tem);
return true;
}
astk.push(tem);
return false;
}
int main() {
int T;
cin >> T;
stack<char> stk_char;
while (T--) {
string s;
cin >> s;
for (int i = 0; i < s.size(); i++) { // 遍历字符串
if (stk_char.empty()) stk_char.push(s[i]); // 空栈没有可以合并或爆炸的,立即压入当前元素,看下一个
else {
char top = stk_char.top();
if (s[i] == top) { // 栈顶元素与当前字符相同才会涉及到合并或爆炸,不相同直接压入栈
if (top == 'O') stk_char.pop(); // 栈顶元素和当前元素都是大泡泡,直接爆炸,出栈栈顶元素
else { // 栈顶元素和当前元素都是小泡泡
// 小泡泡先合并成为大泡泡
stk_char.pop();
stk_char.push('O');
// 然后检查栈顶是否有两个大泡泡,如果有两个大泡泡直接爆炸,出栈栈顶两个元素
while (isDelBig(stk_char)) { // 直到栈顶两个元素不是两个大泡泡为止
stk_char.pop();
stk_char.pop();
}
}
} else {
stk_char.push(s[i]);
}
}
} // for
// 逆序输出字符
string res = "";
while (!stk_char.empty()) {
res = stk_char.top() + res;
stk_char.pop();
}
cout << res << endl;
}
}
// 64 位输出请用 printf("%lld")
当前字符需要与前一个字符比较,因此借助栈来辅助。解题思路为,当前字符与栈顶字符比较,如果不相同直接将当前字符入栈,如果相同需要判断合并(小泡泡)或爆炸(大泡泡)。爆炸仅需出栈栈顶大泡泡,而合并不仅需要出栈栈顶元素小泡泡再入栈大泡泡,还需要判断入栈大泡泡之后,是否会与栈顶第二个元素发生爆炸。最后输出字符串的时候不要忘记逆序输出



京公网安备 11010502036488号