1068 Parencodings

版权声明:版权所有 https://blog.csdn.net/leechengqian/article/details/82996097

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 28505 Accepted: 16798

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).
(p_i表示第i个右括号前的左括号数)
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).
(w_i表示每一个右括号所匹配的左括号到该右括号间的右括号数0)
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

package POJ;
import java.util.Scanner;
/*
1068
 */
public class Parencodings {
    public static void main(String args[]) throws Exception{
        Scanner cin=new Scanner(System.in);
        int seqNum=cin.nextInt();
        for(int i=0;i<seqNum;i++){
            StringBuilder sb=new StringBuilder();
            int len=cin.nextInt();
            int[] p=new int[len];
            int[] w=new int[len];
            for(int j=0;j<len;j++){
                p[j]=cin.nextInt();
            }
            System.out.println();
            for(int k=0;k<p[0];k++)
                sb.append('(');
            sb.append(')');
            for(int j=1;j<len;j++)
            {
                for(int k=p[j-1];k<p[j];k++)
                    sb.append('(');
                sb.append(')');
            }
            //System.out.println(sb);
            String parencodings=sb.toString();
            //System.out.println(temp);
            int[] L=new int[len];//与第i个右括号对应的左括号在序列中的位置
            int[] R=new int[len];//第i个右括号在序列中的位置,可以一遍得出
            /*
            L R范围都是0~2*len-1
             */
            int k=0;
            for(int j=0;j<2*len;j++)
            {
                if(parencodings.charAt(j)==')')
                {
                    R[k]=j;
                    k++;
                }
            }
            L[0]=R[0]-1;//第一个右括号对应的左括号在其左边
            for(k=1;k<len;k++){
                if(R[k]-R[k-1]>1)
                    L[k]=R[k]-1;//左右括号直接相邻
                else
                    for(int temp=L[k-1]-1;temp>=0;temp--)
                    {
                        //if(parencodings.charAt(temp)=='('&&parencodings.charAt(temp+1)!=')')
                        if(parencodings.charAt(temp)=='(')
                        {
                            boolean isAvailable=true;//当前左括号是否已匹配
                            for(int l=0;l<=k;l++){
                                if(L[l]==temp)
                                {
                                    isAvailable=false;
                                    break;
                                }
                            }
                            if(isAvailable){
                                L[k]=temp;
                                break;
                            }
                        }
                    }
            }
            int[] rNums=new int[len];
            for(int j=0;j<len;j++)
            {
                int rightCount=0;
                String subStr=parencodings.substring(L[j],R[j]+1);
                //System.out.print(subStr+"   ");
                for(k=0;k<subStr.length();k++)
                {
                    if(subStr.charAt(k)==')')
                        rightCount++;
                }
                rNums[j]=rightCount;
                //System.out.print(rightCount+" ");
            }
            if(len==1)
                System.out.println(rNums[len]);
            else
            {
                for(int j=0;j<len-1;j++)
                    System.out.print(rNums[j]+" ");
            }
            System.out.print(rNums[len-1]);
            System.out.println();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/leechengqian/article/details/82996097
今日推荐