一次ac蛮开心的。。
题目大意是说给出s表示法就是第i个数表示第i个右括号左边有几个左括号,然后要写出w表示法,,w表示法就是第i个右括号它所配对的左括号是他左边第几个左括号。
思路:这题主要就是一道模拟题。。关键在于利用s表示法将整个序列表示出来,然后就模拟w表示法。。
附上代码:
#include<stdio.h>
#include<string.h>
int s[50];
int a[10010];
char c[10010];
int main ()
{
int t;
scanf("%d",&t);
while (t--)
{
memset(a,0,sizeof(a));
int n;
scanf("%d",&n);
int i,j,start=0;
scanf("%d",&s[0]);
for(i = 0;i < s[0];i++)
c[i] = '(';
c[i++] = ')';
start=i;
for(i = 1;i < n;i++)
{
scanf("%d",&s[i]);
for(j = start;j < start+s[i]-s[i-1];j++)
c[j] = '(';
c[j++] = ')';
start = j;
}
//for(i=0;i < j;i++) printf("%c",c[i]);
//printf("\n");
int end=j,first=0;
for(i = 0;i < end;i++)
{
if(c[i]==')')
{
for(j = i-1;j >= 0;j--)
{
if(c[j]=='(' && a[j]==0)
{
if(!first)
{
printf("%d",(i-j)/2+1); //i-j表示的该右括号其所配对的左括号是该右括号左边的第i-j个括号
first=1; //而i-j这会是一个奇数,在这两个配对的括号之间的都是已经配对好的括号所以我们要做 (i-j)/2+1这样的处理
a[j]=1;
break;
}
else
{
printf(" %d",(i-j)/2+1);
a[j]=1;
break;
}
}
}
}
}
printf("\n");
}
return 0;
}