原题链接:Parencodings
题意:
S (((()()())))
P-sequence 4 5 6666 从左到右每个右括号之前左括号的个数
W-sequence 1 1 1456 从左到右每个右括号和与之配对的左括号内有多少对括号(包括其本身)
#include <cstdio>
const int MAX_N = 20;
int p[MAX_N], w[MAX_N], p1[MAX_N]; //p1[i]表示第i个右括号 左边 相邻左括号的个数
int main(){
int T, n, i, j;
scanf("%d", &T);
while(T --){
scanf("%d", &n);
for(i = 0;i < n;i ++){
scanf("%d", &p[i]);
p1[i] = i > 0 ? p[i] - p[i - 1] : p[i]; //转换为第i个右括号
}
for(i = 0;i < n;i ++){
for(j = i, w[i] = 1; !p1[j --] ;w[i] ++); //w[i]加上左边相邻右括号的个数+1
p1[j + 1] --;
}
for(i = 0;i < n;i ++)
printf("%d%c", w[i], i == n - 1 ? '\n' : ' ');
}
return 0;
}
#include <stdio.h>
#include <string.h>
int p[22], w[22];
int bra[50]; //保存括号0:左括号 1:右括号
int main(){
int T, n;
scanf("%d", &T);
while(T --){
memset(bra, 0, sizeof(bra));
int i, j;
scanf("%d", &n);
int t = 0;
for(i = 0;i < n;i ++){
scanf("%d", &p[i]);
if(i > 0)
t += p[i] - p[i - 1] + 1;
else
t = p[0];
bra[t] = 1; //此处为右括号
}
// for(i = 0;i < 2 * n;i ++)
// printf("%d%c", bra[i], i == 2 * n - 1 ? '\n' : ' ');
int dex = 0;
for(i = 0;i < 2 * n;i ++){
if(bra[i] == 1){ //遇到右括号时
int cnt = 1, vis = 0;
for(j = i - 1;j >= 0;j --){
if(bra[j] == 0){ //右括号左边是左括号
if(vis == 0){
w[dex ++] = cnt;
break;
}
vis --; //遇到左括号与右括号配对,数量减一
}else{ //左边是右括号,数量加1
cnt ++;
vis ++; //记录左边右括号的个数
}
}
}
}
for(i = 0;i < n;i ++){
printf("%d%c", w[i], i == n - 1 ? '\n' : ' ');
}
}
return 0;
}