题目翻译
设S = s1 s2…s2n是一串格式良好的括号。S可以用两种不同的方式编码:q通过一个整数序列P = p1 p2…其中pi是S (P-sequence)中第i个右括号前左括号的个数。q由一个整数序列W = w1 w2…对于每一个右括号,比如S中的a,我们关联一个整数,这个整数是从匹配的a左括号到a. (W-sequence)的右括号数。
输入
输入的第一行包含一个整数t (1 <= t <= 10),测试用例的数量,然后是每个测试用例的输入数据。每个测试用例的第一行是一个整数n (1 <= n <= 20),第二行是一个格式良好的字符串的p序列。它包含n个正整数,用空格隔开,表示p序列。
思路分析
这么小的数据量不就可以为所欲为了吗,我们先通过输入的P序列还原本来的字符序列,然后直接暴力搜索即可。
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;
int n, arr[100], b[100], vis[100];
char str[200];
int main() {
int k = 0;
cin >> k;
for (int i = 0; i < k; i++) {
memset(vis, 0, sizeof(vis));
cin >> n;
int cnt = 0;
for (int i = 0; i < n; i++)cin >> arr[i];
int left = 0;//左括号的数目
for (int i = 0; i < n; i++) {//复原字符串
while (left < arr[i])str[cnt++] = '(', left++;
str[cnt++] = ')';
}
int index = 0, sum = 0;
for (int i = 0; i < cnt; i++) {
sum = 1;
if (str[i] == ')') {
for (int j = i - 1; j > 0; j--) {
if (str[j] == '(' && vis[j])sum++;
else if (str[j] == '(') {
vis[j] = 1; break;//遇到了没匹配过的左括号
}
}
b[index++] = sum;
}
}
for (int i = 0; i < n - 1; i++)cout << b[i] << " ";
cout << b[n - 1] << endl;
}
}