zoukankan      html  css  js  c++  java
  • Codeforces 670E

    题目链接: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]);
    }
  • 相关阅读:
    io系列之常用流一
    C++ 函数参数的默认值
    C++ 函数匹配和作用域声明
    c++ vector 迭代器 demo
    C++ 函数重载和匹配
    C++函数重载和const
    C++函数重载
    iOS开源项目
    Linux系统/网络 笔记
    IO五种模式
  • 原文地址:https://www.cnblogs.com/dilthey/p/10511104.html
Copyright © 2011-2022 走看看