Recently Polycarp started to develop a text editor that works only with correct bracket sequences (abbreviated as CBS).ios
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 "(()(()))":express
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:app
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). ide
There are pictures illustrated several usages of operation "D" below.spa
All incorrect operations (shift cursor over the end of CBS, delete the whole CBS, etc.) are not supported by Polycarp's editor.3d
Polycarp is very proud of his development, can you implement the functionality of his editor?rest
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.code
It is followed by the string of n characters "(" and ")" forming the correct bracket sequence.orm
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.blog
Print the correct bracket sequence, obtained as a result of applying all operations to the initial sequence.
8 4 5
(())()()
RDLD
()
12 5 3
((()())(()))
RRDLD
(()(()))
8 8 8
(())()()
LLLLLLDD
()()
In the first sample the cursor is initially at position 5. Consider actions of the editor:
Thus, the answer is equal to ().
先預處理出每一個(對應的),每一個)對應的(
這個用個棧就好
維護一個像是雙端鏈表的東西,左右移就直接在鏈表上移,對於每一個刪除操做,把它到它對應的符號的位置一段全刪掉便可
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 #include<cmath> 7 #include<queue> 8 #include<deque> 9 #include<set> 10 #include<map> 11 #include<ctime> 12 #define LL long long 13 #define inf 0x7ffffff 14 #define pa pair<int,int> 15 #define mkp(a,b) make_pair(a,b) 16 #define pi 3.1415926535897932384626433832795028841971 17 using namespace std; 18 inline LL read() 19 { 20 LL x=0,f=1;char ch=getchar(); 21 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 22 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 23 return x*f; 24 } 25 int n,m,pos; 26 int go[500010]; 27 char s[500010]; 28 char op[500010]; 29 int zhan[500010],top; 30 int d[500010],l[500010],r[500010]; 31 int main() 32 { 33 n=read();m=read();pos=read(); 34 scanf("%s",s+1); 35 scanf("%s",op+1); 36 for (int i=1;i<=n;i++) 37 { 38 if (s[i]=='(')zhan[++top]=i; 39 else 40 { 41 go[i]=zhan[top]; 42 go[zhan[top]]=i; 43 top--; 44 } 45 d[i]=s[i]=='('; 46 if (i!=1)l[i]=i-1; 47 if (i!=n)r[i]=i+1; 48 } 49 for (int i=1;i<=m;i++) 50 { 51 if (op[i]=='L'){if (l[pos])pos=l[pos];} 52 if (op[i]=='R'){if (r[pos])pos=r[pos];} 53 if (op[i]=='D') 54 { 55 int nex=go[pos]; 56 if (nex<pos)swap(nex,pos); 57 l[r[nex]]=l[pos]; 58 r[l[pos]]=r[nex]; 59 if (r[nex])pos=r[nex];else pos=l[pos]; 60 } 61 } 62 while (l[pos])pos=l[pos]; 63 if (!pos){puts("");return 0;} 64 while (r[pos]) 65 { 66 printf("%c",d[pos]==1?'(':')'); 67 pos=r[pos]; 68 } 69 printf("%c",d[pos]==1?'(':')'); 70 }