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 expression by adding "+"-s and "1"-s to it. For example, sequences "(())()", "()" and "(()(()))" are correct, while ")(", "(()" and "(()))(" are not. Each bracket in CBS has a pair. For example, in "(()(()))":

  • 1st bracket is paired with 8th,
  • 2d bracket is paired with 3d,
  • 3d bracket is paired with 2d,
  • 4th bracket is paired with 7th,
  • 5th bracket is paired with 6th,
  • 6th bracket is paired with 5th,
  • 7th bracket is paired with 4th,
  • 8th bracket is paired with 1st.

Polycarp's editor currently supports only three operations during the use of CBS. The cursor in the editor takes the whole position of one of the brackets (not the position between the brackets!). There are three operations being supported:

  • «L» — move the cursor one position to the left,
  • «R» — move the cursor one position to the right,
  • «D» — delete the bracket in which the cursor is located, delete the bracket it's paired to and all brackets between them (that is, delete a substring between the bracket in which the cursor is located and the one it's paired to).

After the operation "D" the cursor moves to the nearest bracket to the right (of course, among the non-deleted). If there is no such bracket (that is, the suffix of the CBS was deleted), then the cursor moves to the nearest bracket to the left (of course, among the non-deleted).

There are pictures illustrated several usages of operation "D" below.

All incorrect operations (shift cursor over the end of CBS, delete the whole CBS, etc.) are not supported by Polycarp's editor.

Polycarp is very proud of his development, can you implement the functionality of his editor?

Input

The first line contains three positive integers nm and p (2 ≤ n ≤ 500 000, 1 ≤ m ≤ 500 000, 1 ≤ p ≤ n) — the number of brackets in the correct bracket sequence, the number of operations and the initial position of cursor. Positions in the sequence are numbered from left to right, starting from one. It is guaranteed that n is even.

It is followed by the string of n characters "(" and ")" forming the correct bracket sequence.

Then follow a string of m characters "L", "R" and "D" — a sequence of the operations. Operations are carried out one by one from the first to the last. It is guaranteed that the given operations never move the cursor outside the bracket sequence, as well as the fact that after all operations a bracket sequence will be non-empty.

Output

Print the correct bracket sequence, obtained as a result of applying all operations to the initial sequence.

Examples
input
8 4 5
(())()()
RDLD
output
()
 
Note

In the first sample the cursor is initially at position 5. Consider actions of the editor:

  1. command "R" — the cursor moves to the position 6 on the right;
  2. command "D" — the deletion of brackets from the position 5 to the position 6. After that CBS takes the form (())(), the cursor is at the position 5;
  3. command "L" — the cursor moves to the position 4 on the left;
  4. command "D" — the deletion of brackets from the position 1 to the position 4. After that CBS takes the form (), the cursor is at the position 1.

Thus, the answer is equal to ().

 题意:

  给你一个字符串只包含(),为合法匹配的括号串

  给你一系列的操作LRD

  问你最后这个串变成什么了

题解:

  每次操作我们用线段树第k大寻找相邻位置对应左右移动

  对于操作就是区间修改了

  可以先用栈预处理这个区间出来

  都能在线段树上操作

#include<bits/stdc++.h>
using namespace std;
const int N = 1e7+, M = 1e6+, mod = 1e9+; typedef long long ll; char s[N],op[N];
int n,m,p,f[N];
stack<int > q;
int l[N],r[N],sum[N],lazy[N];
void pushdown(int k) {
if(lazy[k]==-) return ;
sum[k<<] = ;
sum[k<<|] = ;
lazy[k<<] = ;
lazy[k<<|] = ;
lazy[k] = -;
sum[k] = sum[k<<]+sum[k<<|];
}
void build(int k,int s,int t) {
l[k] = s;r[k] = t;
sum[k] = ;
lazy[k] = -;
if(s==t) {
sum[k] = ;
return ;
}
int mid = (s+t)>>;
build(k<<,s,mid);
build(k<<|,mid+,t);
sum[k] = sum[k<<]+sum[k<<|];
}
void update(int k,int s,int t) {
if(lazy[k]!=-) {
pushdown(k);
}
if(l[k]==s&&r[k]==t) {
sum[k] = ;
lazy[k] = ;
return ;
}
int mid = (l[k]+r[k])>>;
if(t<=mid) {
update(k<<,s,t);
}
else if(s>mid) update(k<<|,s,t);
else {
update(k<<,s,mid);
update(k<<|,mid+,t);
}
sum[k] = sum[k<<]+sum[k<<|];
}
int ask(int k,int x) {
if(lazy[k]!=-) pushdown(k);
if(l[k]==x&&r[k]==x) {
return sum[k];
}
int mid = (l[k]+r[k])>>;
if(x<=mid) return ask(k<<,x);
else return ask(k<<|,x);
} int ask(int k,int x,int y) {
if(lazy[k]!=-) pushdown(k);
if(l[k]==x&&r[k]==y) {
return sum[k];
}
int mid = (l[k]+r[k])>>;
if(y<=mid) {
return ask(k<<,x,y);
}
else if(x>mid) return ask(k<<|,x,y);
else {
return ask(k<<,x,mid) + ask(k<<|,mid+,y);
}
sum[k] = sum[k<<]+sum[k<<|];
} int query2(int id, int s, int t, int k){
if(lazy[id]!=-) pushdown(id);
if(s == t){
return s;
}
int mid = (s+t)>>;
if(sum[id<<] >= k) {
return query2(id<<, s , mid, k);
}else {
return query2(id<<|, mid + , t, k - sum[id<<]);
}
} int main() {
scanf("%d%d%d",&n,&m,&p);
scanf("%s%s",s+,op+);
for(int i=;i<=n;i++) {
if(s[i]=='(') {
q.push(i);
}
else {
int k = q.top();
f[i] = k;
f[k] = i;
q.pop();
}
}
build(,,n);
for(int i=;i<=m;i++) {
if(op[i]=='R') {
int tmp = ask(,,p);
tmp+=;
p = query2(,,n,tmp);
}
else if(op[i]=='L') {
int tmp = ask(,,p-) ;
p = query2(,,n,tmp);
}
else {
update(,min(f[p],f[f[p]]),max(f[p],f[f[p]]));
p = max(f[p],f[f[p]]);
int tmp = ask(,,p) ;
if(ask(,p,n)) {
p = query2(,,n,tmp+);
}
else if(tmp) {
p = query2(,,n,tmp);
}
else break;
}
}
for(int i=;i<=n;i++) {
if(ask(,i)) {
printf("%c",s[i]);
}
}
cout<<endl;
return ;
}

Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 线段树模拟的更多相关文章

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

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

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

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

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

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

  4. Codeforces 670E - Correct Bracket Sequence Editor - [线段树]

    题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...

  5. Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp

    D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...

  6. Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)

    题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...

  7. Codeforces Round #332 (Div. 2) C. Day at the Beach 线段树

    C. Day at the Beach Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/599/p ...

  8. Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)

    题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...

  9. Codeforces Round #320 (Div. 1) [Bayan Thanks-Round] B. "Or" Game 线段树贪心

    B. "Or" Game Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/578 ...

随机推荐

  1. HDU 4474 Yet Another Multiple Problem BFS

    题意:求m的倍数中不包含一些数码的最小倍数数码是多少.比如15 ,不包含0  1 3,答案是45. BFS过程:用b[]记录可用的数码.设一棵树,树根为-1.树根的孩子是所有可用的数码,孩子的孩子也是 ...

  2. 使用jquery通过AJAX请求方式,后台返回了当前整个HTML页面代码

    该结果分为多种情况: 1.当前项目使用了interceptor/filter,拦截或者过滤了特定请求. 2.在HTML页面使用了表单提交,没有对表单的“onsubmit”事件做return false ...

  3. BootStrap 资源包的下载和使用

    将附件中的包解压,放置webroot中,并在jsp页面中引用它们,即可以使用 bootstrap.rar (78.9 KB) 下载次数: 0

  4. SQLServer XXX IS NOT NULL

    SQLServer中不能使用像Java和C#中的  XXX!=null   这种用法, 使用上面的用法返回值永远是False False False 正确的用法应该是--> XXXis not ...

  5. Laravel5.1学习笔记9 系统架构1 请求生命周期 (待修)

    Request Lifecycle Introduction Lifecycle Overview Focus On Service Providers Introduction When using ...

  6. animation与transition的简单讲述

    CSS动画分为两大组成部分:transition和animation 在CSS 3引入Transition(过渡)这个概念之前,CSS是没有时间轴的.也就是说,所有的状态变化,都是即时完成. tran ...

  7. 【MySQL】通信协议

    1.TCP/IP(Transmission Control Protocol/Internet Protocol) 该通信协议套件用于连接 Internet 上的主机.在 Linux 操作系统中,TC ...

  8. 图像局部显著性—点特征(FREAK)

    参考文章:Freak特征提取算法  圆形区域分割 一.Brisk特征的计算过程(参考对比): 1.建立尺度空间:产生8层Octive层. 2.特征点检测:对这8张图进行FAST9-16角点检测,得到具 ...

  9. 人脸检测的harr检测函数

    眼球追踪需要对人脸进行识别,然后再对人眼进行识别,判断人眼张合度,进而判断疲劳... 解析:人脸检测的harr检测函数使用方法 代码理解: 利用训练集,检测出脸部,画出框 void CAviTestD ...

  10. .NET 在序列化时使用全小写的属性名

    基于某些奇怪的需求,需要将一些对象序列化后输出,而且属性名又必须为小写形式. 解决过程 说到在 .NET 平台上序列化操作,那么第一个想到的应该就是 Json.NET 家的 Newtonsoft.Js ...