toj1242 Parencodings

题目链接:http://acm.tju.edu.cn/toj/showp.php?pid=1242

题目大意:括号匹配问题,给定两个串:第一个串中每个数表示第i个右括号坐边的左括号数,第二个串中的每个数表示与第i个右括号匹配的左括号号的位置(从右往左,且只计算左括号,例如,它如果是该右括号坐标的第一个左括号,它的值就是1,是第二个左括号,它的值就是2,以此类推)

思路:妹啊,读题都读了好久才读懂- -!  然后就开始写,先想办法把括号字符串还原,再从括号字符串出发生成第二个串。 要单从两个串中找关系的话,没有多想,感觉智商已然不够用。

代码:

//toj1242 括号匹配
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;
char s[50];
int a,i,j,l,cas;
int main()
{
    cin>>cas;
    while(cas--)
    {
      int n,len=0,tmp=0;
      //构造括号字符串
      cin>>n;
      for(i=0;i<n;i++)
      {
         cin>>a;
         for(j=len;j<len+a-tmp;j++)
         s[j] = '(';
         
         s[len+a-tmp] = ')';
         len+=a-tmp+1;
         tmp = a;
      }
      //将括号字串生成第二个字符串
      int flag[50];
      memset(flag,0,sizeof(flag));
      int m = 0;
      for(i=0;i<len;i++)
      {
         int num = 1;  //初始化为1方便些,即遇到没有标记的括号的时候,只需把flag标记为1就行了
         if(s[i]==')')
         {
            for(j=i;j>=0;j--)
            {
               if(s[j]=='(' && flag[j]==1) num++;
               else if(s[j]=='(' && !flag[j] )
               {
                    flag[j]=1;
                    break;
               }
            }
            cout<<num;
            m++;
            if(m!=n)
            cout<<" ";
        }
      }
      cout<<endl;
    }
    return 0;
}

还做过其他括号匹配的题目,后面陆续上传分类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值