Parencodings
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序列表示的是从左到右的右括号所在的括号对内有几对括号。
思路想到了其实很简单,首先可以想到如果有了完整的括号串以后,每找到一个右括号,开始向前找左括号,找到后w里面的值就是位置差值除2加1,然后记得把左括号处理或者标记,然后找下一个右括号。
然后开始考虑如何从p序列得到括号串,这个也很容易,就是弄个计数器并初始其值为0,指针指向第一个p序列。当指针没指向p尾如果计数器值小于指针指着的数,向串内放入一个左括号并使计数器+1,否则放入一个右括号,然后指针指向下一个值。
代码
#include <cstdio>
#include <iostream>
using namespace std;
int pa[100],w[30],p[30];
int main()
{
int t,n,i,j,num,k;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=0;i<n;++i){
scanf("%d",&p[i]);
}
j=k=num=0;
for(i=0;i<n;++i){
for(;j<p[i];++j){
pa[k++]=1;
}pa[k++]=0;
}
for(i=0;i<k;++i){
if(!pa[i]){
for(j=i;j>=0&&!pa[j];--j){
}
pa[j]=0;
w[num++]=(i-j+1)/2;
}
}
for(i=0;i<n;++i){
if(i){
putchar(' ');
}
printf("%d",w[i]);
}printf("\n");
}
}
本文介绍了一种算法,用于将括号字符串的P序列转换为其对应的W序列。通过解析输入的P序列来生成括号字符串,并进一步计算每个右括号所在括号对内的括号对数目。
603

被折叠的 条评论
为什么被折叠?



