time limit per test2 seconds

memory limit per test256 megabytes

inputstandard input

outputstandard output

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 n, m 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

()

input

12 5 3

((()())(()))

RRDLD

output

(()(()))

input

8 8 8

(())()()

LLLLLLDD

output

()()

Note

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

command “R” — the cursor moves to the position 6 on the right;

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;

command “L” — the cursor moves to the position 4 on the left;

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 ().

【题解】



让你删除和光标匹配的括号已经它们中间的所有括号;

用链表来模拟删除的过程(直接模拟就好,不要真的删除->更改每个节点的左右端点);

注意到了最右边的时候要往最左走;

可以用栈的思想快速找到每个括号的匹配的位置;

链表有点厉害。

#include <cstdio>
#include <algorithm> using namespace std; const int MAXN = 6e5; struct abcd
{
int l, r;
}; int n, m, pos,before[MAXN],d[MAXN];
char s1[MAXN],s2[MAXN];
abcd p[MAXN]; int main()
{
//freopen("F:\\rush.txt", "r", stdin);
scanf("%d%d%d", &n, &m, &pos);
scanf("%s", s1 + 1);
int now = 0;
for (int i = 1;i <= n;i++)
if (s1[i] == '(')
before[++now] = i;
else
{
d[before[now]] = i;
d[i] = before[now];
now--;
}
p[0].r = 1;
for (int i = 1; i <= n; i++)
p[i].l = i - 1, p[i].r = i + 1;
scanf("%s", s2 + 1);
for (int i = 1; i <= m; i++)
if (s2[i] == 'R')
pos = p[pos].r;
else
if (s2[i] == 'L')
pos = p[pos].l;
else
{
int left = min(d[pos], pos);
int right = max(d[pos], pos);
p[p[left].l].r = p[right].r;
p[p[right].r].l = p[left].l;
pos = p[right].r;
if (pos == n + 1)
pos = p[pos].l;
}
now = p[0].r;
while (now != n + 1)
{
putchar(s1[now]);
now = p[now].r;
}
puts("");
return 0;
}

【31.93%】【codeforces 670E】Correct Bracket Sequence Editor的更多相关文章

  1. CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)

    E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...

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

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

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

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

  4. Codeforces 670E - Correct Bracket Sequence Editor - [链表]

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

  5. Codeforces 670E - Correct Bracket Sequence Editor - [对顶栈]

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

  6. CodeForces 670E Correct Bracket Sequence Editor

    链表,模拟. 写一个双向链表模拟一下过程. #pragma comment(linker, "/STACK:1024000000,1024000000") #include< ...

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

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

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

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

  9. 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 o ...

随机推荐

  1. Path Sum 深度搜索

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  2. LeetCode191 Number of 1 Bits. LeetCode231 Power of Two. LeetCode342 Power of Four

    位运算相关 三道题 231. Power of Two Given an integer, write a function to determine if it is a power of two. ...

  3. C++ 标准库 permutation

    首先,permutation指的是对元素的重排,比方a , b , c 三个元素的全部的重排为    abc, acb, bac,bca,cab,cba 总共 3!  = 6 中情况,可是怎样声称这六 ...

  4. python 文本文件的读取

  5. @codeforces - 932F@ Escape Through Leaf

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 n 个点的树(标号1~n),以结点 1 为根.每个结点 ...

  6. ES6对象的super关键字

    super是es6新出的关键字,它既可以当作函数使用,也可以当作对象使用,两种使用方法不尽相同 1.super用作函数使用的时候,代表父类的构造函数,es6规定在子类中使用this之前必须先执行一次s ...

  7. day10-04_多线程常用属性方法

    一.需要了解的方法 Thread实例对象的方法 # isAlive(): 判断这个线程是否是存活的 # getName(): 获取线程名 # setName(): 设置线程名 #enumerate() ...

  8. QT 中如何实现一个简单的动画

    QT可以实现一下简单的动画,比如 运动的时钟 闪烁的按钮. 动画的实现: (1)创建一个定时器 (2)调用QWidget::update()通知界面重绘 实现一个按钮闪烁的例子: circlewidg ...

  9. Python基础:06条件和循环

    1:条件表达式(三元操作符) Python 在很长的一段时间里没有条件表达式(C ? X : Y), 或称三元运算符.人们试着用 and 和 or 来模拟它, 但大多都是错误的. 根据 FAQ , 正 ...

  10. @bzoj - 4377@ [POI2015] Kurs szybkiego czytania

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定 n, a, b, p,其中 n, a 互质.定义一个长度为 ...