Codeforces Round #350 (Div. 2) E (跳转链表)

【题意】一个括号序列,你有以下三种操作:"L"光标左移;"R"光标右移;"D"删掉这个括号以及和它对应的括号之间的所有括号,并且把光标移动到被删后右边的那个括号上。如果没有了,就移动到串的末尾。现在给你原括号序列和操作,求最终结果!

【分析】由于操作最多有50万个,那么简单想一下用链表来暴力模拟都是能过得去的。那么,我在这里用了类似于跳转链表来模拟这个过程!但是这里我并不是一个一个的跳转的,而是预处理了最大的括号匹配,直接跳转到可以到达的最大位置,这样就更快的完成删除这个过程了!具体实现,见下面的代码!

【AC代码】

#include <stdio.h>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn = 500010;
char s[maxn],q[maxn];
int l[maxn],r[maxn],pos[maxn];//l,r分别来表示左移和右移
int S[maxn];
int main(){
    int n,m,p,top=0;
    cin>>n>>m>>p;
    cin>>s>>q;
    //INIT.
    for(int i=1; i<=n; i++){
        l[i]=i-1,r[i]=i==n?0:i+1;
        if(s[i-1]=='('){
                S[++top] = i;
           }else{
                pos[S[top]] = i;//记录左括号对应的右括号位置
                pos[i] = S[top--];//记录右括号对应的左括号
           }
    }
    //UPdate And Query.
    for(int i=1; i<=m; i++){
        if(q[i-1]=='L') p = l[p];
        else if(q[i-1]=='R') p = r[p];
        else{
            if(s[p-1]==')') p = pos[p];//向左的话就要直接访问pos[p],向右则不用转换!
            //合并区间
            l[r[pos[p]]] = l[p];//清除匹配的括号-->
            r[l[p]] = r[pos[p]];//清除匹配的括号<--
            p = r[pos[p]]==0?l[p]:r[pos[p]];
        }
    }
    while(l[p]) p=l[p];//找到最左边的括号的位置
    while(p){
        cout<<s[p-1]<<"";
        p = r[p];
    }
    return 0;
}
时间: 2024-10-24 09:19:45

Codeforces Round #350 (Div. 2) E (跳转链表)的相关文章

【解题报告】Codeforces Round #350 (Div. 2)

题目链接 A.Holidays(Codeforces 670A) 思路 首先,若 7 能整除 n 的话,最小假期天数 m1 与最大假期天数 m2 都等于 2×n7 ."整除"提示我们可以根据 n 除以 7 的余数来分类: 余数为 0 , m1=m2=2×n7 . 余数为 1 ,考虑多出来的那天是不是周末, m1=2×n7,m2=2×n7+1 . 余数为 6 ,考虑多出来的6天中必然有周末,考虑有1天周末还是2天周末, m1=2×n7+1,m2=2×n7+2 . 其它余数,考虑多出来的那

Codeforces Round #350 (Div. 2) E 思维模拟

给出一个合法的括号串 有LRD三种操作 LR分别是左右移动当前位置 且合法 D为删除这个括号和里面的所有 当删除完成后 位置向右移动 如果不能移动 就向左 比赛都是很久远的事情了 写这道题也是一时兴起 先写了一发暴力 先拿a记录下来与这个括号相匹配的括号位置 拿vis记录括号是否被删除 每次碰到false的括号就整体跳过 然后一气跑到了test78才停下来 想了想暴力肯定不行 就加了l数组和r数组 来记录当前位置的左右仍存在的括号在哪 每次进行移动和删除的时候都利用这个进行移动 顺便更改 有一种

Codeforces Round #350 (Div. 2) F. Restore a Number 模拟构造题

F. Restore a Number Vasya decided to pass a very large integer n to Kate. First, he wrote that number as a string, then he appended to the right integer k — the number of digits in n. Magically, all the numbers were shuffled in arbitrary order while

Codeforces Round #350 (Div. 2) D2 二分

五一期间和然然打的团队赛..那时候用然然的号打一场掉一场...七出四..D1是个数据规模较小的题 写了一个暴力过了 面对数据如此大的D2无可奈何 现在回来看 一下子就知道解法了 二分就可以 二分能做多少个 每次对mid求一下不够的差值 比较差值与m的大小进行l与r的变换 由于自己一向对二分比较迷茫 自己琢磨出来一套神奇的办法面对边界数据 当小于和大于的时候 抛弃mid值 当等于的时候 直接break 然后打一发while试试能否向更好的情况偏移 当然在这个题目中 如果是直接break的时候就不用

Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor

E. Correct Bracket Sequence Editor Recently Polycarp started to develop a text editor that works only with correct bracket sequences (abbreviated as CBS). Note that a bracket sequence is correct if it is possible to get a correct mathematical express

Codeforces Round #350 (Div. 2) 题解

Holidays Game of Robots Cinema Magic Powder - 12 Correct Bracket Sequence Editor Restore a Number Holidays #include<bits/stdc++.h> using namespace std; #define For(i,n) for(int i=1;i<=n;i++) #define Fork(i,k,n) for(int i=k;i<=n;i++) #define Re

Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 线段树模拟

E. Correct Bracket Sequence Editor Recently Polycarp started to develop a text editor that works only with correct bracket sequences (abbreviated as CBS). Note that a bracket sequence is correct if it is possible to get a correct mathematical express

Codeforces Round #350 (Div. 2)

A. Holidays 题意:一个礼拜有两天放假,那么n天最多和最少分别有多少天假呢? 题解:首先算最少的,就是n%7,如果余6的话则要+1.最多则是尽量让余下的天数为假期,如果余一天就加一天,余二就加两天,大于二依然只加两天,直到余六再加一天. 代码: 1 /*A*/ 2 #include<cstdio> 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 while(scanf("%d",&n)!=EOF)

Codeforces Round #350 (Div. 2) A

Description On the planet Mars a year lasts exactly n days (there are no leap years on Mars). But Martians have the same weeks as earthlings — 5 work days and then 2 days off. Your task is to determine the minimum possible and the maximum possible nu