算法
(模拟、思维) $O(n)$
注意到 reverse
的复杂度是 $O(n)$,所以直接模拟题意是行不通的。
我们不妨对 reverse
做一个标记 rev
,每次读到 $R$,直接令 rev = !rev
即可
对于添加字符这个操作来说,如果当前的 rev
为 true
,则把 $S$ 中的当前字符加在当前字符串 $T$ 的左边,否则加在 $T$ 的右边。建议用 deque
来维护。
结束以上的操作过后,如果当前的 rev
为 true
, 则将 $T$ 翻转。
对于最后的删除操作,可以开一个字符串变量 ans
用来记录答案,然后从前往后遍历 $T$,对于 $T$ 的当前字符 $c$,每个如果 ans
的末尾字符和 $c$ 一样,则将 ans
的末尾字符剔除,否则 ans += c
。
此外,这题的操作和 IPFL 有点像。
C++ 代码
#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::string;
using std::deque;
int main() {
string s;
cin >> s;
deque<char> d;
bool rev = false;
for (char c : s) {
if (c == 'R') rev = !rev;
else {
if (rev) d.push_front(c);
else d.push_back(c);
}
}
if (rev) {
reverse(d.begin(), d.end());
}
string ans;
for (char c : d) {
if (ans.size() != 0 and ans.back() == c) {
ans.pop_back();
}
else ans += c;
}
cout << ans << '\n';
return 0;
}