Time Limit: 1000MS |
|
Memory Limit: 10000K |
Total Submissions: 18825 |
|
Accepted: 11348 |
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
题目意思:P序列是右括号前面的左括号数目,W序列是每个右括号和与它匹配的左括号之间包含的配对括号数目(包含自身)。
解题思路:用数组数值模拟左右括号,-1代表左括号,1代表右括号。从头开始寻找右括号,然后往前找到和它匹配的左括号,把它置为0,统计它们之间0的个数,得到答案。
#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 1005
int main()
{
int T,i,j,k,t,si,n,a[N],f[N],ans[N];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
a[0]=0;
memset(f,0,sizeof(f)); //数组初始化
si=1;
for(i=1;i<=n;i++)
{
t=a[i]-a[i-1]; //新增加的左括号个数
for(j=si;j<t+si;j++)
f[j]=-1;
si+=t;
f[si++]=1; //si记录起点位置
}
for(i=1,k=0;i<si;i++)
{
if(f[i]==1) //找到一个未配对右括号
{
for(j=i-1;j>0;j--)
{
if(f[j]==-1) //找到相匹配的左括号
{
f[j]=0;
break;
}
}
for(t=0;j<i;j++) //统计他们之间包含的配对括号数目
if(f[j]==0)
t++;
ans[k++]=t;
}
}
for(i=0;i<k-1;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[k-1]);
}
return 0;
}
poj 1068 Parencodings,布布扣,bubuko.com
poj 1068 Parencodings
原文:http://blog.csdn.net/u011721440/article/details/23181873