题意: 给定n个括号,给定m次操作,给定初始位置,求操作后剩下的括号
思路:首先记录每一个括号的左右,并且记录每一个括号和他匹配括号的 位置,进行模拟,R表示当前位置向右移动一个位置,L表示向左移动一个位置,D表示删除当前括号和他匹配的括号,这种模拟好绕,很难理解。。。。。。加油!!!只要坚持,一定会收获的更多!!!
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
#include <cstring>
#include <stack>
using namespace std;
int l[500005],r[500005];//记录每一个括号的左右
char c[500005];//输入的括号
int a[500005];
int n,m,p;
int main() {
cin >> n >> m >> p;//p是当前的位置
cin >> (c+1);
memset(a,0,sizeof(a));
stack <int>s;
for(int i = 0; i <= n+2; i++) {
l[i] = i-1;
r[i] = i+1;
}
for(int i = 1; i <= n; i++) {//通过栈来获取当前的括号匹配的位置
if(c[i] == '(') {
s.push(i);
} else {
int sp = s.top();
a[i] = sp;
a[sp] = i;
s.pop();
}
}
char op;
while(m--) {
cin >> op;
if(op == 'R') {
p = r[p];
}
if(op == 'L') {
p = l[p];
}
if(op == 'D') {
int L,R;
if(c[p] == '(') {//左括号,那么删除与它匹配的括号,光标的位置变为它的匹配的右括号,
L = l[p];
R = r[a[p]];
p = R;
} else {
L = l[a[p]];
R = r[p];
p = r[p];
}
r[L] = R;
l[R] = L;
if(p > n) {
p = l[p];
}
}
}
for(int i = r[0]; i <= n; i=r[i]) {
cout << c[i];
}
return 0;
}