1068 Parencodings:小さなデータは、我々は、彼らがやりたいことができるということです、シミュレートされた暴力、0msKO

タイトル変換

集合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;
	}
}
公開された186元の記事 ウォン称賛13 ビュー9293

おすすめ

転載: blog.csdn.net/csyifanZhang/article/details/105255775