1068 Parencodings:小数据就是可以为所欲为,暴力模拟,0msKO

题目翻译

设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;
	}
}
发布了186 篇原创文章 · 获赞 13 · 访问量 9293

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105255775