poj 1068--Parencodings
Description
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:
Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.
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-代表的是这个右括号前面有几个左括号
w-代表的是和这个右括号匹配的左括号在第几位
现在已知p矩阵,要求w的值。。
做完看到网上好多推出什么公式的。。我是直接用数组模拟的,先将所有的括号形式都存到数组中,然后在从后往前找与之匹配的,算出w的值,不算很好的方法,但是感觉应该好理解些。。
View Code
1 #include <stdio.h> 2 #include <string.h> 3 int main() 4 { 5 int t,n; 6 int i,j,k; 7 int p[22],w[22],s[100]; 8 scanf("%d",&t); 9 while(t--) 10 { 11 scanf("%d",&n); 12 for(i=0; i<n; i++) 13 scanf("%d",&p[i]); 14 for(i=0; i<p[0]; i++) 15 s[i]=-1; 16 s[i++]=1; 17 for(j=1; j<n; j++) 18 { 19 for(k=0; k<p[j]-p[j-1]; k++) 20 s[i++]=-1; 21 s[i++]=1; 22 } 23 //for(j=0;j<i;j++) 24 //printf("%d",s[j]); 25 i=n-1; 26 for(j=2*n-1; j>=0; j--) 27 { 28 if(s[j]==1) 29 { 30 int sum=0; 31 for(k=j;; k--) 32 { 33 sum+=s[k]; 34 if(sum==0) 35 break; 36 } 37 w[i--]=(j-k+1)/2; 38 } 39 } 40 printf("%d",w[0]); 41 for(j=1; j<n; j++) 42 printf(" %d",w[j]); 43 printf("\n"); 44 } 45 return 0; 46 }