#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")
当前字符需要与前一个字符比较,因此借助栈来辅助。解题思路为,当前字符与栈顶字符比较,如果不相同直接将当前字符入栈,如果相同需要判断合并(小泡泡)或爆炸(大泡泡)。爆炸仅需出栈栈顶大泡泡,而合并不仅需要出栈栈顶元素小泡泡再入栈大泡泡,还需要判断入栈大泡泡之后,是否会与栈顶第二个元素发生爆炸。最后输出字符串的时候不要忘记逆序输出