您的位置:首页 > 其它

解题报告之POJ1068—Parencodings

2014-01-20 20:17 381 查看
Parencodings

Time Limit: 1000MS

Memory Limit: 10000K

Total Submissions: 11191

Accepted: 6590

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

Source

Tehran 2001



先说下题目的意思吧

P-sequence :每个右括号之前有多少个左括号

W-sequence : 每个右括号是与之匹配的左括号之后的第几个




思路:开始觉得要用栈做,但是具体也不知道怎么应用。

于是就用白痴的模拟法做的。

先将P排列变还原成括号的形式。

然后依据括号计算W排列。

总之就是模拟人计算的过程。其实感觉这种方法比较笨,但是一时又实在想不出很巧妙的方法。它们之间应该存在某些更直接的数学关系,但是没能找到。

代码如下:

#include<stdio.h>
main()
{
    int p[100]={0};
    int a[100]={0};
    int i,j,n,x,k;
    int count;
    while(scanf("%d",&x)!=EOF)
    {
        while(x--)
        {
            count=0;
            scanf("%d",&n);
            for(i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                if(i==0)
                {
                    for(j=1;j<=a[0];j++)
                        p[j]=1;
                    p[j++]=-1;
                }
                if(i>0)
                {
                    for(k=0;k<(a[i]-a[i-1]);k++)
                        p[j++]=1;
                    p[j++]=-1;
                }
            }
            k=0;
            for(i=1;p[i]!=0;i++)
            {
                if(p[i]==-1)
                {
                    for(count=0,j=i;p[j]!=1;count-=p[j],j--);
                    p[j]=0;
                    a[k++]=count;
                }
            }
            for(i=0;i<k-1;i++)
                printf("%d ",a[i]);
            printf("%d\n",a[i]);
        }
    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: