題目連接: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]); }