首页 > 代码库 > POJ1068——Parencodings
POJ1068——Parencodings
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:
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
题目大意:
设序列 S 是一个完全匹配的括号序列。序列 S 能用下面两种不同方法加密:
通过一个整数序列 P = p1 p2...pn ,其中 pi 表示序列 S 中第 i 个右括号 ")" 之前的左括号 “(” 的数量。当然这些括号是从左到右数的。
通过一个整数序列 W = w1 w2...wn ,wi 表示从第 i 个右括号 ")" 相匹配的左括号 “(” 的位置开始数的右括号 “)” 的数目,包括第 i 个右括号 “)” 本身。 (摘自百度知道)
输入序列P输出序列W。
结题思路:模拟做的。根据序列P将字母串写出来,在根据W的规则写出序列W。(被String的用法坑了。。)
Code:
1 #include<string> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 string tmp; 7 int T,n,a[10000],i,j,k,t,cnt,sum; 8 cin>>T; 9 while (T--) 10 { 11 cin>>n; 12 k=0; 13 tmp=""; 14 for (i=1; i<=n; i++) 15 { 16 cin>>a[i]; 17 if (i!=1) t=a[i]-a[i-1]; 18 else t=a[i]; 19 for (j=1; j<=t; j++) 20 tmp+=‘(‘; 21 tmp+=‘)‘; 22 } 23 k=0; 24 for (i=0; i<=tmp.length()-1; i++) 25 if (tmp[i]==‘)‘) 26 { 27 cnt=0,sum=0; 28 for (j=i; j>=0; j--) 29 { 30 if (tmp[j]==‘)‘) cnt++,sum++; 31 else cnt--; 32 if (!cnt) break; 33 } 34 a[k++]=sum; 35 } 36 for (i=0; i<k; i++) 37 { 38 cout<<a[i]; 39 if (i!=k-1) cout<<‘ ‘; 40 else cout<<endl; 41 } 42 } 43 return 0; 44 }