poj 1068 Parencodings
Parencodings
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 22797 | Accepted: 13363 |
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
Source
1 //poj 1068 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <stack> 6 #include <iostream> 7 using namespace std; 8 stack<int> s; 9 int main(){ 10 //freopen("D:\\INPUT.txt","r",stdin); 11 int t,n; 12 cin>>t; 13 while(t--){ 14 while(!s.empty()){ 15 s.pop(); 16 } 17 cin>>n; 18 int i,j,k,num,pre=0; 19 for(i=0;i<n;i++){ 20 if(i){ 21 cout<<" "; 22 } 23 scanf("%d",&num); 24 //cout<<num<<endl; 25 j=num-pre;//相邻两个右括号之间的左括号数目-1 26 pre=num;//记录前一个右括号前面哪有几个左括号 27 if(j==1){//多一个左括号 28 cout<<1; 29 if(!s.empty()){ 30 s.top()++; 31 } 32 } 33 else{ 34 if(!j){//相等 35 int next=++s.top(); 36 cout<<s.top(); 37 s.pop(); 38 if(!s.empty()){ 39 s.top()+=next; 40 } 41 } 42 else{//隔了不止一个左括号 43 cout<<1; 44 j--; 45 while(j--){ 46 s.push(0); 47 } 48 s.top()++; 49 } 50 } 51 } 52 cout<<endl; 53 //cout<<"aa"<<endl; 54 } 55 return 0; 56 }