Description
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
Output
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
Source
/*#include <iostream>
POJ 1068 Parencodings
简单模拟
用数组a[i]表示第i个右括号和第i+1个右括号间的左括号数
然后逐渐找和右括号匹配的左括号所处的位置
i-j
Source
第一种表示方法,')'前有多少个'(';
第二种表示方法:"()"中"()"的数量;
using namespace std;
const int Max=50;
int main()
{
int t;
int n;
int p[Max];
int w[Max];
int a[Max];
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>p[i];
a[0]=p[1];
for(int i=1;i<n;i++)
a[i]=p[i+1]-p[i];用数组a[i]表示第i个右括号和第i+1个右括号间的左括号数
int j;
for(int i=1;i<=n;i++)
{
for(j=i-1;j>=0;j--)
if(a[j]>0)//找到左括号;
{
a[j]--;
break;
}
w[i]=i-j;然后逐渐找和右括号匹配的左括号所处的位置i-j
}
for(int i=1;i<=n-1;i++)
cout<<w[i]<<" ";
cout<<w[n]<<endl;
}
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n,a[100]={0},p[100]={0}
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>p[i];
a[i]=p[i]-p[i-1];
}
for(int i=1;i<=n;i++)
{
int j=i;
while(a[j]==0&&j>=0)
{
j--;
}
cout<<i-j+1;
if(i!=n)
cout<<' ';
else
cout<<endl;
a[j]--;
}
}
return 0;
}*/
#include<iostream>
#include<cstring>
using namespace std;
int xt[50];//第i个‘)’和第i+1个‘)’之间‘(’的个数;
int main()
{
int n,t,p[30],w[30];
cin>>t;
while(t--)
{
cin>>n;
memset(xt,0,sizeof(xt));
int x=0,left=0;
for(int i=1;i<=n;i++)
{
cin>>p[i];
if(p[i]!=left)
{
x+=p[i]-left;
left=p[i];
}
xt[++x]=1;//
}
int k=0,kill=0;
for(int i=1;i<=2*n;i++)
{
if(xt[i]==1)
{
kill=1;
for(int j=i-1;j>=0;j--)
{
if(xt[j]==-1)
{
kill++;
}
else if(xt[j]==0)
{
w[k++]=kill;
xt[j]=-1;
break;
}
}
}
}
for(int i=0;i<n;i++)
if(i==n-1||n==1)
cout<<w[i]<<endl;
else
cout<<w[i]<<" ";
}
return 0;
}