Codeforces 670E - Correct Bracket Sequence Editor - [鏈表]

題目連接: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]);
}
相關文章
相關標籤/搜索