题目链接:https://codeforces.com/contest/670/problem/E
题意:
给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号)。
有如下操作:
1、往左移动一下光标;
2、往左移动一下光标;
3、删除当前光标指向的括号,以及和它匹配的那个括号,以及这两个括号之间的所有括号。
要求你给出在做完所有操作后的括号串。
题解:
数组模拟链表即可,每种操作都是 $O(1)$ 的时间复杂度。
AC代码:
#include<bits/stdc++.h> using namespace std; const int maxn=5e5+5; int n,m,p; char s[maxn],op[maxn]; stack<int> S; int bro[maxn]; int head,tail,pre[maxn],nxt[maxn]; int main() { cin>>n>>m>>p; scanf("%s",s+1); nxt[head=0]=1; pre[tail=n+1]=n; for(int i=1;i<=n;i++) { pre[i]=i-1, nxt[i]=i+1; if(s[i]=='(') S.push(i); if(s[i]==')') bro[S.top()]=i, bro[i]=S.top(), S.pop(); } scanf("%s",op+1); for(int i=1;i<=m;i++) { if(op[i]=='L') p=pre[p]; if(op[i]=='R') p=nxt[p]; if(op[i]=='D') { int st=min(p,bro[p]), ed=max(p,bro[p]); int pre_st=pre[st], nxt_ed=nxt[ed]; nxt[pre_st]=nxt_ed; pre[nxt_ed]=pre_st; if(nxt_ed<tail) p=nxt_ed; else p=pre_st; } } for(int i=nxt[head];i<tail;i=nxt[i]) printf("%c",s[i]); }