【POJ】Parencodings

来源:互联网 发布:装饰桌面的软件 编辑:程序博客网 时间:2024/06/05 07:32

Parencodings

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 21004 Accepted: 12590

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 6666W-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
Tehran 2001

#include <iostream>#include <memory.h>using namespace std;class Solution{public:    Solution(){    s=NULL;    res=NULL;    }    ~Solution(){    if(s!=NULL)        delete s;    if(res!=NULL)        delete res;    }    int *solve(int n,int *p){    if(n==0)        return NULL;    if(s!=NULL)        delete s;    if(res!=NULL)        delete res;    //Construct s;    s=new char[2*n];    res=new int[n] ;    memset(s,0,2*n);    for(int i=0;i<n;++i)        res[i] =1;    for(int i=0;i<n;++i)        s[p[i] +i]=1; //")"    for(int i=p[0],k=0;i<n*2;++i){        //Find the "("        if(s[i] !=1)        continue;        for(int j=i-1;j>=0;--j)        if(s[j] ==0){            s[j] =-1;            ++k;            break;        }else if(s[j] ==1){            ++res[k] ;        }        }    /*    for(int i=0;i<2*n;++i)        if(s[i] ==-1)        cout<<'(';    else if(s[i] ==1)        cout<<')';    else        cout<<"Wrong";    cout<<endl;    */    return res;    }private:    char *s;    int *res;};int main(){    int total=0,n=0;    cin>>total;    Solution s;    int *res;    while(total>0){    cin>>n;    int *tmp=new int[n] ;    for(int i=0;i<n;++i)        cin>>tmp[i] ;    res=s.solve(n,tmp);    for(int i=0;i<n;++i)        cout<<res[i] <<' ';    cout<<endl;    --total;    }return 0;}
0 0
原创粉丝点击