题目链接:http://codeforces.com/contest/670/problem/E
给你n长度的括号字符,m个操作,光标初始位置是p,'D'操作表示删除当前光标所在的字符对应的括号字符以内的所有字符(比如'(()())'),'R'操作表示右移光标,'L'操作表示左移光标。删除操作后光标向右移,要是再向右移没有字符的话,那就停在最后的字符上了。问你最后的括号字符是怎么样的。
这题用链表写简单多了,直接模拟操作就行了,我用stl里的list。
#include <bits/stdc++.h>
using namespace std;
char str[] , op[];
int main()
{
ios::sync_with_stdio(false);
int n , m , p , r = , l = ;
list <char> L;
cin >> n >> m >> p >> str >> op;
for(int i = ; i < n ; ++i)
L.push_back(str[i]);
auto index = L.begin();
while(--p) {
index++;
}
for(int i = ; i < m ; i++) {
if(op[i] == 'L') {
if(index != L.begin()) {
index--;
}
}
else if(op[i] == 'R') {
if(++index == L.end()) {
index--;
}
}
else {
l = r = ;
if(*index == ')')
r++;
else
l++;
if(l < r) {
L.erase(index--);
while(r != l) {
if(*index == ')')
r++;
else
l++;
L.erase(index--);
}
if(++index == L.end()) {
index--;
}
}
else {
L.erase(index++);
while(r != l) {
if(*index == ')')
r++;
else
l++;
L.erase(index++);
}
if(index == L.end()) {
index--;
}
}
}
}
index = L.begin();
for( ; index != L.end() ; ++index) {
cout << *index;
}
cout << endl;
}