poj 1068

题意:给定p数组 让求w数组

      p数组;

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

P-sequence 4 5 6666//)括号 左边(括号的个数
W-sequence 1 1 1456//)括号所匹配的括号中的括号对数
用一个栈来模拟
#include<iostream>
using namespace std;
int p[55];
int w[55];
int y[55];
int stack[55];
int main()
{
	int t,i,top,wi,n,j,k;
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(i=0;i<n;i++)
			cin>>p[i];
		//(-------1
		//)-------0
		j=0;
		for(j=0,i=0;j<n;j++)
		{
			for(i;i<p[j]+j;i++)
				y[i]=1;
			y[i]=0;   //先把括号存起来
			i++;
		}
		top=-1;
		int sum;
		wi=0;
		for(i=0;i<2*n;i++)
		{
			if(y[i]==1)//若是(括号直接存起来
			{
				stack[++top]=1;
				continue;
			}
		    sum=0;         //若是)则查找与之匹配的左括号并在匹配除标记   
			for(k=top;stack[k]!=1&&k>=0;k--)
				sum++;
			stack[k]=-1;
			w[wi++]=sum+1;
		}
		for(i=0;i<n-1;i++)
			cout<<w[i]<<" ";
		cout<<w[n-1]<<endl;
	}
	return 0;
}



		

 


posted @ 2014-05-26 20:24  _一千零一夜  阅读(131)  评论(0编辑  收藏  举报