#include <iostream> #include<string> #include<deque> using namespace std; int main() { //使用一个长度为四的滑动窗口来处理即可(用双向队列来实现) //如果窗口中出现了三个连续的相同字母,则删掉一个窗口中最后出现的相同字符 //如果窗口中出现两对一样的字母,则去掉第二队的一个字母(也去掉后出现的那个) int n; cin >> n; string line; while (n--) { cin >> line; int len = line.size(); //如果只有一个或两个字母就直接输出 if (len <= 2) { cout << line; continue; } if (len == 3)//判断是否是相同的三个字母 { if (line[0] == line[1] && line[1] == line[2]) line.erase(2, 1);//删除一个字母 cout << line; continue; } deque<char>win;//窗口中存储四个字符 //先存入三个 for (int i = 0; i < 3; i++) win.push_back(line[i]); //开始循环,流程是插入字符,判断是否要弹出元素,然后弹出并输出队列首位置,重复流程 for (int i = 3; i < len; i++) { win.push_back(line[i]); //情况一,后三个为连续的相同字符 if (win[1] == win[2] && win[2] == win[3]) win.pop_back(); //情况二,前三个为连续相同字符 else if (win[0] == win[1] && win[1] == win[2]) win.pop_front(); //情况三,出现两对相同字母 else if (win[0] == win[1] && win[2] == win[3]) win.pop_back(); //输出并弹出首元素 if (win.size() == 4) { cout << win.front(); win.pop_front(); } } //输出win中剩余的元素 for (char it : win) cout << it; cout<<endl; } } // 64 位输出请用 printf("%lld")