题目描述:一个括号序列S可以用两种方式编码:P序列和W序列。
两种编码方式得到的序列定义如下:
- P=P1P2······Pn, Pi表示从左至右每一个右括号左边有多少个左括号。
- W=W1W2······Wn,Wi表示从左至右每一个右括号匹配的左括号是从它
开始往左数的第几个左括号。
例如:
- S= (((()()())))
- P= 4 5 6 6 6 6
- W= 1 1 1 4 5 6
现在要求设计程序,输入括号序列的P序列,输出其对应的W序列。
输入格式:
第一行一个整数t,表示输入有t组数据。
每组数据两行。
第一行一个整数n,表示P序列的长度。
第二行n个整数,表示P序列。
输出格式:
一行n个整数,表示对应的W序列。
数据约定: 1<=t<=10,1<=n<=20
解题思路: 赤果果的暴力有木有,代码能力强点的一次性都能过。
我的代码:
#include <cstdio>
int main(int argc, char const *argv[])
{
int t;
for(scanf("%d", &t);t; --t){
int n, p[100];
scanf("%d", &n);
for(int i=0; i<n; ++i){
scanf("%d", p+i);
}
bool bracket[100];
int len = 0, leftnum = 0;
for(int i=0; i<n; ++i){
while(leftnum<p[i]){
bracket[len] = false;
++leftnum;
++len;
}
bracket[len++] = true;
}
int w[100], wlen = 0;
int stack[100], top = 0;
for(int i=0; i<len; ++i){
if(bracket[i]){
int cnt = 0;
int left = stack[--top];
for(int j=i; j>=left; --j){
if(!bracket[j]) {
++cnt;
}
}
w[wlen++] = cnt;
} else {
stack[top++]=i;
}
}
for(int i=0; i<wlen; ++i){
printf("%d ", w[i]);
}
printf("\n");
}
return 0;
}