# poj 1068

79人阅读 评论(0)
Parencodings
 Time Limit: 1000MS Memory Limit: 10000K

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

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iomanip>
#include <algorithm>
#include <iomanip>
#include <cmath>
using namespace std;
int main()
{
int t,n,a[25],b[1000],i,cnt,k,j,x[1000],visit[1000],tmp,m;
char c[1000];
cin>>t;
while(t--)
{
cin>>n;
for(i=0;i<n;i++)
{
cin>>a[i];//a数组用来记录pi的值
}
cnt=0;
for(i=0;i<a[0];i++)
{
c[cnt++]='(';//用c数组来模拟出整个括号字符串
}
c[cnt++]=')';
for(i=1;i<n;i++)
{
if(a[i]>a[i-1])
{
for(k=0;k<a[i]-a[i-1];k++)
{
c[cnt++]='(';//如果下一项的值要比该项的值大，那么它们两个的中间肯定增加了a[i]-a[i-1]个左括号
}
c[cnt++]=')';
}else{//如果两者相等，直接添加右括号
c[cnt++]=')';
}
}
for(i=0;i<cnt;i++)
{
b[i]=0;//记录wi的值
}
memset(visit,0,sizeof(visit));//visit数组用来标记，求wi时，我们要找到与“）”最近且没有被匹配过的“（”
for(j=0;j<cnt;j++)
{
if(c[j]==')')
{
if(c[j-1]=='(')
{
b[j]=1;
visit[j-1]=1;//如果匹配了，那么我们要把这个左括号标记
}else{
tmp=1;//不匹配，则要往左寻找与它相匹配的左括号
for(m=j-1;;m--)
{
if(c[m]==')')
{
tmp++;
}else{
if(!visit[m])//如果找到左括号且没有被标记，那么肯定是可以和它匹配的
{
visit[m]=1;//把它进行标记
b[j]=tmp;//把右括号的个数储存到b数组里
break;
}
}
}
}
}
}
k=0;
for(m=0;m<cnt;m++)
{
if(b[m])
{
x[k++]=b[m];//因为b数组里含有许多0，不方便输出，所以我用了x数组，把b数组非0的值全部进行储存
}
}
for(i=0;i<k-1;i++)
{
cout<<x[i]<<" ";//x数组就是我们要求的wi序列，进行输出
}
cout<<x[k-1]<<endl;
}
return 0;
}


0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：5060次
• 积分：386
• 等级：
• 排名：千里之外
• 原创：34篇
• 转载：1篇
• 译文：1篇
• 评论：0条
文章分类
阅读排行
评论排行