poj1068

先通过p序列求出括号表达式,这部很简单,按顺序来就是,之后就要通过括号表达式,求出w序列的过程用构造的方法实现,用count_l,count_r来记录,左右括号数。遇到‘)’则count_r++,反之,count_l++。D[i].power记录权值,若其权值为0,D[i].count不再改变,最后其count的值,即为w序列的值。

#include<iostream>
#include<string>
const int MAXN = 21;
using namespace std;
struct data
{
bool flag;
int power;
int count;
data()
{
flag = false;
power = 0;
count = 0;
}
};
int main()
{
int T(0);cin>>T;
while(T--)
{
int n(0);cin>>n;int j(0);
int p_sequence[MAXN];
string st;
for(string::size_type i = 0;j!=n;i+=2,j++)
{
st.insert(i,"(");
st.insert(i+1,"(");
cin>>p_sequence[j];
}
int k=0;
for(int j=0;j!=n;j++)
{
string::size_type i = i=p_sequence[j]+k;
st.replace(i,1,")");
k++;
}
// cout<<st<<endl;
data D[MAXN];
int count_l(0),count_r(0);
for(int i = 2*n-1;i>=0;i--)
{
if(st[i]==')')
{
count_l++;
for(int j = 0;j<count_l;j++)
{
if(D[j].flag == true && D[j].power == 0)
continue;
D[j].flag = true;
D[j].power++;
D[j].count++;
}
}
else
{
count_r++;
for(int j = 0;j<count_l;j++)
{
if(D[j].flag == true && D[j].power == 0)
continue;
D[j].power--;
}
}


}
for(int i = n-1;i!=-1;i--)
{
cout<<D[i].count<<" ";
}
cout<<endl;
}
return 0;
}

你可能感兴趣的:(poj1068)