POJ 1068 Parencodings(模拟)

Description

Let S = s1 s2…s2n be a well-formed string of parentheses. S can be encoded in two different ways:
q By an integer sequence P = p1 p2…pn where pi is the number of left parentheses before the ith right parenthesis in S (P-sequence).
q By an integer sequence W = w1 w2…wn where for each right parenthesis, say a in S, we associate an integer which is the number of right parentheses counting from the matched left parenthesis of a up to a. (W-sequence).

Following is an example of the above encodings:

S		(((()()())))

P-sequence	    4 5 6666

W-sequence	    1 1 1456

Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.

Input

The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case is an integer n (1 <= n <= 20), and the second line is the P-sequence of a well-formed string. It contains n positive integers, separated with blanks, representing the P-sequence.

Output

The output file consists of exactly t lines corresponding to test cases. For each test case, the output line should contain n integers describing the W-sequence of the string corresponding to its given P-sequence.

Sample Input

2
6
4 5 6 6 6 6
9
4 6 6 6 6 8 9 9 9

Sample Output

1 1 1 4 5 6
1 1 2 4 5 1 1 3 9

第一种是一个右括号前有几个左括号
第二种是一对匹配的括号之中有几个括号

思路

读入第一种的形式,相邻两个数相减就是新增加的左扩号数,每有一个左括号就将其压入栈中,这里用数字代替,为了表示一个左扩号右面有几个最括号,也就是一对括号之中有几个扩号,因为每一个左括号都会有一个右括号与之匹配,同时先匹配最右边的。出现一个左括号就压入0,同时前面所有的左括号对应数值都加一,出现右括号,则将最右边的弹出。这里需要对前面的数进行操作,方便起见,使用了vector来存储。
还有这是一道坑题,数据的组数大于了题中所说,存储数组开大点

代码

#include<iostream>
#include<vector>
using namespace std;

vector<int>q;

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		int a[101];								//开大点 
		q.clear();
		for(int i=1;i<=n;i++)
			cin>>a[i];
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=a[i]-a[i-1];j++)		//几个左括号 
				q.push_back(0);					//压入0 
			for(int k=0;k<q.size();k++)
				q[k]++;							//包括自己,前面的所有加1 
			cout<<q[q.size()-1]<<" ";			//vector从0开始,要减1 
			q.pop_back();
		}
		cout<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值