Parencodings
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 13 Accepted Submission(s) : 7
Problem Description
Let S = s1 s2 … s2n be a well-formed string of parentheses. S can be encoded in two different ways: [ul] [li]By an integer sequence P = p1 p2 … pn where pi is the number of left parentheses before the ith right parenthesis in S (P-sequence).[/li] [li]By an integer sequence W = w1 w2 … wn where for each right parenthesis, say a in S, we associate an integer which is the number of right parentheses counting from the matched left parenthesis of a up to a. (W-sequence).[/li] [/ul] Following is an example of the above encodings: [pre] S (((()()()))) P-sequence 4 5 6666 W-sequence 1 1 1456 [/pre] Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.
Input
The first line of the input file contains a single integer t (1 t 10), the number of test cases, followed by the input data for each test case. The first line of each test case is an integer n (1 n 20), and the second line is the P-sequence of a well-formed string. It contains n positive integers, separated with blanks, representing the P-sequence.
Output
The output file consists of exactly t lines corresponding to test cases. For each test case, the output line should contain n integers describing the W-sequence of the string corresponding to its given P-sequence.
Sample Input
2 6 4 5 6 6 6 6 9 4 6 6 6 6 8 9 9 9
Sample Output
1 1 1 4 5 6 1 1 2 4 5 1 1 3 9
Source
2001 Asia Regional Teheran
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int T,num,i,j,sign,sum,K,k,z,tend,alto; 7 scanf("%d",&T); 8 while(T--) 9 { 10 int a[1000]={0},b[1000],c[1000]={0}; 11 scanf("%d %d",&num,&sign); 12 a[sign]+=1; 13 b[0]=sign; 14 getchar(); 15 for(i=sign+1,j=1,k=1;j<num;j++,i++) 16 { 17 18 scanf("%d",&sum); 19 if(sign==sum) 20 { 21 a[i]+=1; 22 b[k]=i; 23 k++; 24 } 25 else 26 { 27 K=sum-sign; 28 a[i+K]+=1; 29 b[k]=i+K; 30 k++; 31 i=i+K; 32 } 33 sign=sum; 34 } 35 36 for(j=0;j<k;j++) 37 for(z=b[j]-1,tend=1;z>=0;z--) 38 { 39 if(a[z]==1) 40 continue; 41 else 42 { 43 if(a[z]==0) 44 {a[z]='N';c[j]+=1;break;} 45 else 46 { 47 if(a[z]=='N') 48 { 49 c[j]+=1; 50 } 51 continue; 52 } 53 } 54 } 55 for(j=0;j<k;j++) 56 { 57 printf("%d",c[j]); 58 if(j!=k-1) 59 putchar(' '); 60 } 61 putchar(' '); 62 } 63 return 0; 64 65 }