https://ac.nowcoder.com/acm/contest/11164/C
题目描述:
小 L 发明了一个文本编辑器,由于小 L 非常垃圾,所以写出的文本编辑器也很垃圾。 该文本编辑器的运行方式大概是这样的:一开始文本为空,有一个光标在开头,每一次小 L 会输入一个字符,该字符就会被插入到光标的位置上,然后光标会随机地停留在该字符的左边或右边。 现在小 L 用这个文本编辑器打了一大段文字,但他却忘了保存了,他只记得他依次打了哪些字符和打完每个字符后光标停在了该字符的左边还是右边,你能帮助他还原出最终文本的内容吗?
输入描述:
输入文件有两行,第一行为一个字符串s,第二行为一个字符串t。
s, t 的长度相同,s 为一个仅包含小写字母的字符串,t 为一个仅包含'L', 'R' 的字符串。分别表示小 L 依次打了哪些字符,和每打完一个字符后光标停在了字符的左边还是右边( 'L' 为左边,'R' 为右边)。
输出描述:
输出仅一行一个字符串,为最终文本的内容。
看成了双向链表, 不过还是有些参考价值, 故发篇题解。
看一下AC代码:
#include <iostream> using namespace std; const int N = 2e6 + 10; int l[N], r[N], idx = 0; char e[N]; void init() { std::ios::sync_with_stdio(false); } void insert(char op, char x) { if (op == 'R') { e[idx] = x; r[idx] = r[idx - 1]; r[idx - 1] = idx; l[idx] = idx - 1; if (r[idx] != -1) l[r[idx]] = idx; } else { e[idx] = x; l[idx] = l[idx - 1]; l[idx - 1] = idx; r[idx] = idx - 1; if (l[idx] != -1) r[l[idx]] = idx; } idx ++; } void Print() { int begin = 0; for (int i = 0; i < idx; i ++ ) if (l[i] == -1) { begin = i; break; } while (begin != -1) { cout << e[begin]; begin = r[begin]; } cout << e[begin]; //cout << endl; } int main(){ init(); string s, fx; cin >> s >> fx; int n = s.size(); l[idx] = -1; r[idx] = -1; e[idx ++] = s[0]; for (int i = 1; i < n; i ++ ) insert(fx[i - 1], s[i]); Print(); return 0; }
其实没有这么复杂啦, 因为光标只能在前一个的左边或者右边, 因此只用两个字符串就可以解决了。 具体见榜一题解。
(唉, 我还是太菜了呀。)