タイトル変換
集合S = S1、S2 ... S2Nは文字列である整形式ブラケット。整数P = P1 P2の配列によって、Q ... Sは、のi番目の左右のフロントブラケットブラケット(P-シーケンス)の数であるPI:Sは、2つの異なる方法で符号化することができます。Q = W1、W2 ...ようなSのように右括弧のそれぞれについて、我々は整数シーケンスWの整数を関連付ける、左ブラケットこの試合から右括弧の(W-シーケンス)数の整数です。
エントリー
入力の最初の行は整数tを(1 <= T <= 10)が含まれ、テストケースの数と、各テストケースは、入力されたデータです。各テストの最初の行は、整数N(1 <= N <= 20)であり、2行目はよくシーケンス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;
}
}