1068 Parencodings
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();
}
}
}