POJ - 1068 Parencodings
Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways:
q 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).
q 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).
Following is an example of the above encodings:
S (((()()())))
P-sequence 4 5 6666
W-sequence 1 1 1456
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 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
将输入的P序列再模拟回括号(这里用01表示),再读出W序列
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 5 using namespace std; 6 7 int c[45]; 8 int p[25],w[25]; 9 10 int main() 11 { 12 int T,n,s1,s2; 13 scanf("%d",&T); 14 while(T--) 15 { 16 memset(c,0,sizeof(c)); 17 memset(p,0,sizeof(p)); 18 memset(w,0,sizeof(w)); 19 s1=s2=0; 20 scanf("%d",&n); 21 for(int i=0;i<n;i++) 22 scanf("%d",&p[i]); 23 for(int i=0;i<n;i++) 24 { 25 for(int j=s2;j<p[i]-s1+s2;j++) 26 c[j]=0; 27 s2+=p[i]-s1; 28 s1=p[i]; 29 c[s2++]=1; 30 } 31 n=0; 32 /* for(int i=0;i<40;i++) 33 cout<<c[i];*/ 34 for(int i=0;i<40;i++) 35 { 36 if(c[i]) 37 { 38 //cout<<i<<" "; 39 s1=s2=1; 40 for(int j=i-1;j>=0;j--) 41 { 42 if(c[j]) 43 { 44 s1++; 45 s2++; 46 } 47 else 48 s1--; 49 if(!s1) 50 { 51 w[n++]=s2; 52 break; 53 } 54 } 55 } 56 } 57 for(int i=0;i<n;i++) 58 printf("%d ",w[i]); 59 printf("\n"); 60 } 61 62 63 return 0; 64 }