题目连接:https://codeforces.com/contest/670/problem/E
html
题意:c++
给出一个已经匹配的括号串,给出起始的光标位置(光标老是指向某个括号)。数组
有以下操做:spa
一、往左移动一下光标;code
二、往左移动一下光标;htm
三、删除当前光标指向的括号,以及和它匹配的那个括号,以及这两个括号之间的全部括号。blog
要求你给出在作完全部操做后的括号串。ci
题解:get
数组模拟链表便可,每种操做都是 $O(1)$ 的时间复杂度。it
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]); }