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;
}

浙公网安备 33010602011771号