题目表述:
Problem Description
Let S = s1 s2 … s2n be a well-formed string of parentheses. S can be encoded in two different ways:
Following is an example of the above encodings:
Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.
- 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).
- 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 file 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序列号:
模拟枚举方法:
#include<stdio.h>
int main()
{
int i,j,k;
int s[100],a[100],w[100];
int bbs;
int n;
scanf("%d",&bbs);
while(bbs--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&s[i]);
}
a[0]=s[1];
for(i=1;i<n;i++)
a[i]=s[i+1]-s[i];
for(i=1;i<=n;i++)
{
for(j=i-1;j>=0;j--)
{
if(a[j]>0)
{
a[j]--;
break;
}
}
w[i]=i-j;
}
for(i=1;i<=n;i++)
{
if(i==1)
printf("%d",w[i]);
else printf(" %d",w[i]);
}
printf("\n");
}
}
我们还可以用栈来写:
#include<string>
#include<vector>
#include<map>
#include<set>
#include<list>
#include<deque>
#include<utility>
#include<functional>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<ctype.h>
#include<fstream>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<stack>
using namespace std;
int main()
{
stack<int>op;
stack<int>pp;
int bbs,n,c;
scanf("%d",&bbs);
int i,j,k;
while(bbs--)
{
scanf("%d",&n);
int a=0,b=0;
for(i=1;i<=n;i++)
{
scanf("%d",&c);
a=c;
for(j=b+1;j<=a;j++)
{
op.push(-1);
}
b=a;
if(op.top()==-1)
{
if(i==1)
printf("1");
else printf(" 1");
op.pop();
op.push(1);
}
else
{
int t=1;
while(op.top()==1)
{
op.pop();
t++;
}
op.pop();
printf(" %d",t);
while(t--)
{
op.push(1);
}
}
}
while(!op.empty()) op.pop();
printf("\n");
}
return 0;
}