有一串完全匹配的有’(‘和’)‘两种字符的字符串
输入n个数字
代表有n个左括号和n个右括号
此时输入有n个大小的p数组
代表p1 p2…pn
p1代表第一个右括号前面的左括号的数量
要求你求出w数组w1 w2 …wn
w1 代表与第一个右括号 匹配的左括号中间 包含的成括号数(包含自身)
例子:
((()()()))
p数组: 3 4 5 5 5
w数组: 1 1 1 4 5

解法:
模拟一遍
根据p数组 长度为n 把长度为2*n的原序列求出来
把为左括号设置为1 右括号设置为2
再根据原序列把w数组求出来
具体操作可以看下面代码:


#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<cstring>
#include<cstdio>
//#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define mod 1e9 + 7
#define line printf("--------------");
using namespace std;
#define maxn 1005
#define kk 30
int arr[maxn];
int p[kk], w[kk];

int main() {
	int n, t;
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1; i<=n; i++){
			cin>>p[i];
		}
		p[0] = 0;
		memset(arr, -1, sizeof(arr));
		for(int i = 1, j = 0; i <= n; i++){
			for(int k = 0; k < p[i] - p[i-1]; k++){
				arr[j++] = 1;
			}
			arr[j++] = 2;
		}
//		for(int i = 0; i < 2*n; i++){
//			cout<<arr[i]<<" ";
//		}
//		cout<<endl;
		for(int i = 0, l = 0, k;i <2*n; i++){
			k = 0;
			if(arr[i] == 2){
				for(int j = i-1; j >= 0; j--){
					if(arr[j] == 1){
						arr[j] = 0;
						w[l++] = 1+k;
//						cout<<"==="<<k<<endl;
						break;
					}else if(arr[j] == 0){
						k++;
					}
//					printf(%d "%d ==", k);
				}
//				cout<<endl;
			}
		}
		for(int i = 0; i < n; i++){
			printf("%d", w[i]);
			if(i != n-1){
				printf(" ");
			}else {
				printf("\n");
			}
		}
	}
	return 0;
}