首页 > 代码库 > 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 }