给出一个合法的括号串 有LRD三种操作 LR分别是左右移动当前位置 且合法

D为删除这个括号和里面的所有 当删除完成后 位置向右移动 如果不能移动 就向左

比赛都是很久远的事情了 写这道题也是一时兴起 先写了一发暴力 先拿a记录下来与这个括号相匹配的括号位置 拿vis记录括号是否被删除 每次碰到false的括号就整体跳过

然后一气跑到了test78才停下来 想了想暴力肯定不行 就加了l数组和r数组 来记录当前位置的左右仍存在的括号在哪 每次进行移动和删除的时候都利用这个进行移动 顺便更改 有一种并查集路径压缩的感觉

然后一气跑到了test93接着超时 看了一眼数据 这时候长度已经满了 基本是()()()这样 但是我的路径压缩应该不怕这个的 比较不解

过了两天又看了一眼代码 发现我的lr数组可以做到LR是线性的 但是D的时候 我先向右寻找 如果找不到的话 再向左寻找 这个时候 由于我设定的是 如果可以找到一个true的点 就进行更改 这样可能会有很多时间被浪费在无用的D后向右探测

于是改了一下 如果D后向右没有找到可行的括号 就直接将r[w]设为n+1 直接不可行

这里和并查集不同的是 并查集的路径压缩 这条路径中的所有的fa[x]最终都会是一个顶点 而这个题目中 所有变为false的括号都不会再出现了 它必定会被我以某种方式跳过去(通过匹配括号的转移和lr数组的优化) 所以我只需要更改仍然true的点的lr就可以了

当然..做过了这道题之后去百度了一下别人的解法..看到别人题解上的链表两字 突然就明白怎么做了..

当然其实路径压缩后 实际每次LRD的操作还是O(1)的

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<map>
#include<queue>
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
using namespace std;
bool vis[500050];
int n,m,p;
char s[500050];
int a[500050];
char z[500050];
stack<int >sta;
int l[500050];
int r[500050];
int w;
int main()
{
cin>>n>>m>>p;
scanf("%s",s+1);
scanf("%s",z+1);
while(!sta.empty())
sta.pop();
for(int i=1;i<=n;i++)
{
if(s[i]=='(')
{
sta.push(i);
}
else
{
a[i]=sta.top();
sta.pop();
}
}
memset(vis,true,sizeof(vis));
for(int i=n;i>=1;i--)
{
if(s[i]==')')
{
int x=a[i];
a[x]=i;
}
}
for(int i=1;i<=n;i++)
{
l[i]=i-1;
r[i]=i+1;
} w= p;
for(int i=1;i<=m;i++)
{
if(z[i]=='L')
{
int ww=w;
w=l[w];
while(w>=1&&vis[w]==false)
{
if(s[w]==')')
{
int x=a[w];
w=x;
w=l[w];
}
else
{
w=l[w];
}
}
l[ww]=w;
r[w]=ww;
}
else if(z[i]=='R')
{
int ww=w;
w=r[w];
while(w<=n&&vis[w]==false)
{
if(s[w]=='(')
{
int x= a[w];
w=x;
w=r[w];
}
else
{
w=r[w];
}
}
r[ww]=w;
l[w]=ww;
}
else if(z[i]=='D')
{
int x=a[w];
vis[x]=false;
vis[w]=false;
int cs= w;
if(s[w]=='(')
{
int x=a[w];
w=x;
}
int ww=w;
w=r[w];
while(w<=n&&vis[w]==false)
{
if(s[w]=='(')
{
int x= a[w];
w=x;
w=r[w];
}
else if(s[w]==')')
{
w=r[w];
}
}
if(w<=n)
{
r[cs]=w;
r[ww]=w;
l[w]=ww;
continue;
}
r[cs]=n+1;
r[ww]=n+1;
w=cs;
if(s[w]==')')
{
int x=a[w];
w=x;
}
ww=w;
w=l[w];
while(w>=1&&vis[w]==false)
{
if(s[w]==')')
{
int x=a[w];
w=x;
w=l[w];
}
else if(s[w]=='(')
{
w=l[w];
}
}
l[ww]=w;
l[cs]=w;
r[w]=ww;
}
}
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
for(int k=i;k<=a[i];k++)
vis[k]=false;
i=a[i];
}
}
for(int i=1;i<=n;i++)
if(vis[i])
printf("%c",s[i]);
printf("\n");
}

  

Codeforces Round #350 (Div. 2) E 思维模拟的更多相关文章

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

    题目链接: http://codeforces.com/contest/670/problem/E 题解: 用STL的list和stack模拟的,没想到跑的还挺快. 代码: #include<i ...

  2. Codeforces Round #350 (Div. 2) D2. Magic Powder - 2

    题目链接: http://codeforces.com/contest/670/problem/D2 题解: 二分答案. #include<iostream> #include<cs ...

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

    题目链接:http://codeforces.com/contest/670/problem/E 给你n长度的括号字符,m个操作,光标初始位置是p,'D'操作表示删除当前光标所在的字符对应的括号字符以 ...

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

    codeforces 670A. Holidays 题目链接: http://codeforces.com/contest/670/problem/A 题意: A. Holidays On the p ...

  5. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 栈 链表

    E. Correct Bracket Sequence Editor 题目连接: http://www.codeforces.com/contest/670/problem/E Description ...

  6. Codeforces Round #350 (Div. 2) D1. Magic Powder - 1 二分

    D1. Magic Powder - 1 题目连接: http://www.codeforces.com/contest/670/problem/D1 Description This problem ...

  7. Codeforces Round #350 (Div. 2) C. Cinema 水题

    C. Cinema 题目连接: http://www.codeforces.com/contest/670/problem/C Description Moscow is hosting a majo ...

  8. Codeforces Round #350 (Div. 2) B. Game of Robots 水题

    B. Game of Robots 题目连接: http://www.codeforces.com/contest/670/problem/B Description In late autumn e ...

  9. Codeforces Round #350 (Div. 2) A. Holidays 水题

    A. Holidays 题目连接: http://www.codeforces.com/contest/670/problem/A Description On the planet Mars a y ...

随机推荐

  1. Java 16进制、unicode互转

    package service; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CodeCh ...

  2. git 学习笔记4--.gitignore

    很多时候,我们都不希望非源码的文件加入到repository管理. 这时,.gitignore文件就上场了. ignore规则 所有空行或者以注释符号 # 开头的行都会被 Git 忽略. 可以使用标准 ...

  3. HDU1402 A * B Problem Plus(FFT)

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 初学FFT. http://www.cnblogs.com/WABoss/p/FFT_Note.html ...

  4. fragment中嵌入viewpager的问题

    今天终于解决了这个问题 原来问题是出现于viewpager在这里的layout_height不能设置为"wrap_content" 之前我遇到空白的问题,我还以为是管理的问题 所以 ...

  5. 【原】iOS学习45之多媒体操作

    1. 音频 1> 音频实现简述 iOS 里面共有四种专门实现播放音频的方式: System Sound Services(系统声音服务) OpenAL(跨平台的开源的音频处理接口) Audio ...

  6. python 代码片段25

    #coding=utf-8 # 虽然python是面向对象的语言,但是没有显式的构造函数概念. # python没有new关键词 class MyClass(object): pass m=MyCla ...

  7. Hadoop学习笔记(2)

    Hadoop序列化:Long 和Int---变长编码的方法: 如果整数在[ -112, 127] ,所需字节数为1,即第一个字节数就表示该值. 如果大于127,则第一个字节数在[-120,-113]之 ...

  8. 在ScrollView下加入的组件,不能自动扩展到屏幕高度

    ScrollView中的组件设置android:layout_height="fill_parent"不起作用的解决办法 在ScrollView中添加一个android:fillV ...

  9. OpenResy+Lua 利用百度识图 将图片地址解析成文字

    LUA代码:(注:LUA里有一个调用百度识图的接口IP:123.125.115.189(stu.baidu.com),不知为什么我的虚拟机无法解析stu.baidu.com,所以我只能PING出IP来 ...

  10. 洛谷 P1015 回文数 Label:续命模拟QAQ

    题目描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...