这道题看题目条件看了好久,第一个p方式还是挺好理解的,就是在右括号的左边有几个左括号就输出几,第二个w方式的话一开始一直没看懂a是干嘛的,后来发现并没有什么用,它的意思就是与右括号匹配的左括号里有几个右括号本身也包括在内。
知道了这个之后我就模拟了一下,先根据P生成括号,然后从右向左搜索遇到第一个右括号就从它开始向左搜索,记录右括号的个数,直到遇到左括号为止,这时输出个数然后把左括号标记为‘*’。
#include<iostream>
#include<stdio.h>
using namespace std;
int Pway[100],Wway[100];
char Parentheses[1000];
int ans;
void Translate(int i){
ans=0;
for(int j=i;j>=0;j--){
if(Parentheses[j]==')'){
ans+=1;
}
if(Parentheses[j]=='('){
printf("%d",ans);
Parentheses[j]='*';
return;
}
}
}
int Generate(int n){
int cnt,j;
for(cnt=0;cnt<Pway[0];cnt++){
Parentheses[cnt]='(';
}
Parentheses[cnt]=')';
j=cnt+1;
for(int i=1;i<n;i++){
if(Pway[i]>Pway[i-1]) {
// cout<<"i:"<<i<<endl;
for(;j<=Pway[i]-Pway[i-1]+cnt;j++){
Parentheses[j]='(';
// cout<<"Pway[i]-Pway[i-1]+cnt:"<<Pway[i]-Pway[i-1]+cnt<<endl;
}
Parentheses[j++]=')';
cnt=j-1;
}
else{
Parentheses[j++]=')';
cnt=j-1;
}
}
return j;
}
int main()
{
// freopen("input.txt","r",stdin);
int n,cnt,T;
int step;
cin>>T;
while(T--){
cin>>n;
cnt=0;
step=0;
for(int i=0;i<n;i++){
scanf("%d",Pway+i);
}
cnt=Generate(n);
for(int i=0;i<cnt;i++){
if(Parentheses[i]==')'){
if(step!=0) {
printf(" ");
}
else step=1;
Translate(i);
}
}
printf("\n");
}
}