S (((()()())))
P-sequence 4 5 6666
W-sequence 1 1 1456
题目大意:给定一个序列P,代表这个序列中一共有n对括号,第i个右括号左边有Pi个左括号,要求求出序列w,序列w表示第i个右括号所组成的一对括号中有Wi对括号(包括本身)
思路:先把P序列转化为括号序列,然后从左向右找右括号,从这个括号向左找第一个左括号,把能和它配对的左括号一并删除(中间一定没有别的括号存在)
#include<iostream>
#include<cstdio>
using namespace std;
int a[30];//恢复的括号序列,1表示左括号,2表示右括号
int b[30];
int T,n,x,cnt;
int main()
{
scanf("%d",&T);
for (int I = 1;I <= T;I++)
{
cnt = 0;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&x);
a[x+i] = 2;
}
for (int i=1;i<=n*2;i++)
if (!a[i]) a[i] = 1;
for (int i=1;i<=n*2;i++)
if (a[i] == 2)
{
a[i] = 0;
cnt ++; //右括号个数,编号
for (int j=i-1;j>=1;j--)
{
if (a[j] == 1)
{
b[cnt] = (i-j+1)/2;
a[j] = 0;
break;
}
a[j] = 0;
}
}
for (int i=1;i<=cnt;i++) printf("%d ",b[i]);
printf("
");
}
}