Parencodings
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 Source |
题意:一个已配对的括号序列,P数组表示第i个右括号之前的左括号总数,W表示第i个右括号最近的左括号(先配对,两两相对)数。
解析:根据P数组,先模拟还原括号序列,我这里用的1表示左括号,2表示右括号。然后再根据规律推出W数组。我这里用的是开循环直接扫描,扫描到第l个2,再开一个循环往回扫描,扫描时记下0的个数k,直到到的第一个1,将他赋值为0(表示已经扫描过,起到计数的作用),那么W数组的第l个元素为k+1。
以下是我的AC代码
#include <stdio.h>
#include <string.h>
int main()
{
int t;
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
int n,P[25],W[25],arr[1000];
scanf("%d",&n);
for(int i=1; i<=n; i++)
scanf("%d",&P[i]);
P[0]=0;
for(int i=1,j=0; i<=n; i++)
{
for(int k=0; k<P[i]-P[i-1]; k++)
arr[j++]=1;
arr[j++]=2;
} //根据P数组推出来的括号序列并存入arr数组
for(int i=0,l=0,k; i<2*n; i++)
{
k=0;
if(arr[i]==2)
{
for(int j=i-1; j>=0; j--)
{
if(arr[j]==1)
{
arr[j]=0;
W[l++]=1+k;
break;
}
else if(arr[j]==0) k++;
}
}
} //根据arr数组推出W数组
for(int i=0; i<n; i++)
{
printf("%d",W[i]);
if(i!=n-1) printf(" ");
else printf("\n");
}
}
return 0;
}
测试数据就用的题目给出的样例。