题目来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1016
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
int p[25], match[50];
char str[50];
int T, i, j, k, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
p[0] = 0;
j = 1;
for(i= 1; i <= n; ++i)
{
scanf("%d", &p[i]);
int tmp = p[i] - p[i-1];
for(k = 1; k <= tmp; ++k)//复原规范的括号序列
str[j++] = '(';
str[j++] = ')';
}
str[j] = '\0';
n *= 2;//括号序列的长度为n的2倍
j = 1;
for(i = 1; i <= n; ++i)
{
if(str[i] == '(')
match[j++] = i;//记录'('的位置
else
{
printf("%d", (i - match[j-1] + 1)/2);//输出w序列
j--;
if(i != n)
printf(" ");
}
}
printf("\n");
}
return 0;
}