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
第一种是一个右括号前有几个左括号
第二种是一对匹配的括号之中有几个括号
思路
读入第一种的形式,相邻两个数相减就是新增加的左扩号数,每有一个左括号就将其压入栈中,这里用数字代替,为了表示一个左扩号右面有几个最括号,也就是一对括号之中有几个扩号,因为每一个左括号都会有一个右括号与之匹配,同时先匹配最右边的。出现一个左括号就压入0,同时前面所有的左括号对应数值都加一,出现右括号,则将最右边的弹出。这里需要对前面的数进行操作,方便起见,使用了vector来存储。
还有这是一道坑题,数据的组数大于了题中所说,存储数组开大点
代码
#include<iostream>
#include<vector>
using namespace std;
vector<int>q;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int a[101]; //开大点
q.clear();
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=a[i]-a[i-1];j++) //几个左括号
q.push_back(0); //压入0
for(int k=0;k<q.size();k++)
q[k]++; //包括自己,前面的所有加1
cout<<q[q.size()-1]<<" "; //vector从0开始,要减1
q.pop_back();
}
cout<<endl;
}
return 0;
}