POJ-1068 Parencodings


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

水题。由于没注意空格错了一会。

题意就是告诉第i个右括号前有几个左括号

打印第i个括号,前有几个匹配的括号

思路用的:STL队列,逆匹配

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <queue>
using namespace std;
char s[1000];
int main()
{
    std::ios::sync_with_stdio(false);
    int t,n,i,j,a[30],b[30],l;
    cin>>t;
    while(t--)
    {
        cin>>n;
        l = 0;
        for(i = 0;i<n;i++)
                {
                    cin>>a[i];
                    b[i] = a[i] + i;
                }
        for( i = 0;i<a[0];i++)
            s[i] = '(';
        s[i] = ')';
        l = i;
        l++;
        for(i = 1;i<n;i++)
        {
            for(j = 0;j<a[i]-a[i-1];j++)
                s[l++] = '(';
            s[l++] = ')';
        }
        s[l] = '';
        queue<char>q;
        int co = 0;
        for(i = 0;i<n;i++)
        {
            q.push(s[b[i]]);
            co = 0;
            for(j = b[i]-1;j>=0;j--)
            {
                if(q.empty())
                    break;
                if(s[j]==')')
                    q.push(s[j]);
                else if(s[j]=='(' && q.front()==')')
                    {
                        q.pop();
                        co++;
                    }
            }
            if(i<n-1)
            printf("%d ",co);
            else
                printf("%d
",co);
        }
    }
    return 0;
}


原文地址:https://www.cnblogs.com/yutingliuyl/p/6820488.html