3673 - 括号

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

S1,S2…S2N是一个很好的括号。有两种不同的方式编码:

<span style="font-size:14px;">有一个整数序列P1、P2&nbsp;,P&nbsp;=…PN,其中 Pi&nbsp; 是 S 的第 i 个右括号前面的左括号个数。。</span>

<span style="font-size:14px;">有一个整数序列W =&nbsp;W1,W2…WN,对于 S 中的某一个右括号 a,Wi 是从与 a 匹配的左括号开始数起,数到</span>

<span style="font-size:14px;">&nbsp;a 为止的右括号个数。</span>

<span style="font-size:14px;">以下是上述编码的一个例子:</span>

<span style="font-size:14px;">S(((()()())))</span>

<span style="font-size:14px;">序列 </span><span style="font-size:14px;">4 5 6 6 6 6</span>

<span style="font-size:14px;">&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;1&nbsp;1 4 5

6

<span style="font-size:14px;">写一个程序来转换编码</span>

题目输入

输入的第一行包含一个整数T(1≤t≤10),为测试用例的数量,每个测试案例的第一行是一个整数N(1 < =

 n≤20),第二行是一个P字符串序列包含n个正整数,中间用空格隔开。

题目输出

对于每一个测试案例,输出行包含N个整数描述对应给定字符串的W序列。中间用空格隔开。

输入/输出样例

输入格式

2
6
4 5 6 6 6 6
9
4 6 6 6 6 8 9 9 9

输出格式

1 1 1 4 5 6
1 1 2 4 5 1 1 3 9

C语言解答

#include<stdio.h>
#include<string.h>
int main()
{
	int i,j,p[25]={0},w[25],t,n,k,c,x;
	while(scanf("%d",&t)==1)
	{
		for(;t;t--)
		{
			scanf("%d",&n);
			x=0;c=0;
			memset(p,0,sizeof(p));
			memset(w,0,sizeof(w));
			for(i=0;i<n;i++)
			{
				scanf("%d",&k);
				if(c==k)p[++x]=2;
				else{
					while(c<k)
						if(p[x]==0){p[x++]=1;c++;}
						else if(p[x]==1){c++;x++;}
						else x++;
					p[x]=2;
				}
			}
			for(i=0;i<=x;i++)
			{
				if(p[i]==2)
				{
					for(j=i-1,c=0;j>=0;j--)
					{
						if(p[j]==2)c++;
						if(p[j]==1&&w[j]==0){
							if(i==x)printf("%d",c+1);
							else printf("%d ",c+1);
							w[j]=1;break;}
						if(j==0)printf("0 ");
					}
				}
			}
			printf("\n");
		}
	}
	return 0;
}

C++解答

#include <stdio.h>

int main(){
char s[150],*p,*q;
int a,b;
int rp,lp,lmp,is_match;
int t,n,i,j;
scanf("%d",&t);
while(t--){
    scanf("%d",&n);
    a=0,b=0;
    p=&s[0];
    j=n;
    while(j--){
        scanf("%d",&b);
        i=b-a;
        while(i--)
            *p++='(';
        *p++=')';
        a=b;
    }
    *p='\0';
    p=&s[0];
    while(*p++){
        rp=0,lp=0;
        is_match=0;
        if(*p==')'){
            q=p-1;
            while(*q=='('||*q==')'){
                if(*q==')'){
                    rp++;
                }
                else if(*q=='('){
                    if(!rp)
                        is_match=1;
                    else
                        rp--;
                    lp++;
                    }
                if(is_match){
                    printf("%d",lp);
                    break;
                }
                q--;
            }
            if(!is_match)
              printf("%d",0);
            if(--n>0)
              printf(" ");

        }
    }
if(t)
printf("\n");
}
return 0;

}