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:
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 1456Write 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.
思路:source为输入,delta为匹配了该右括号之后,该右括号之前还有多少个左括号没匹配,result保存结果。
若delta[i]>=0,说明该距离上个右括号之前就有未匹配的左括号,故result[i]=0
若delta[i] < 0,说明要往前遍历,找到第一个delta不为0的右括号。
#include<iostream>
using namespace std;
int source[21];
int delta[21];
int result[21];
int main(){
int total_case;
cin>>total_case;
source[0] = 0;
while(total_case--){
int total_nums,j;
cin>>total_nums;
for(int i = 1; i <= total_nums;i++){
cin>>source[i];
delta[i] = source[i]-source[i-1]-1;
}
for(int i = 1; i <= total_nums;i++){
if(delta[i] == -1){
for(j = i-1; j >= 0; j--){
if(delta[j] > 0)
break;
}
result[i] = i-j+1;
delta[j]--;
}else{
result[i] = 1;
}
}
for(int i = 1; i <= total_nums;i++){
cout<<result[i]<<" ";
}
cout<<endl;
}
}