poj 1068 括号搭配

模拟的题型,基本难度不大,关键读懂题意:

对于给出的原括号串,存在两种数字密码串:

1.p序列:当出现匹配括号对时,从该括号对的右括号开始往左数,直到最前面的左括号数,就是pi的值。

2.w序列:当出现匹配括号对时,包含在该括号对中的所有右括号数(包括该括号对),就是wi的值。

题目的要求:对给出的p数字串,求出对应的s串。

串长限制均为20

 

提示:在处理括号序列时可以使用一个小技巧,把括号序列转化为01序列,左0右1,处理时比较方便


#include <iostream>  
    using namespace std;  
    int squence[50],p[50];  
    bool flag[50];  
    int main(){  
        int i,j,k,t,n,loc,left,cnt;  
        cin>>t;  
        while(t--)  
        {  
            cin>>n;  
            loc = 1;  
            left = 1;  
            memset(flag,0,sizeof(flag));  
            for (i = 1;i <= n;i++)  
            {  
                cin>>p[i];  
                while (left<p[i])  
                {  
                    squence[++loc] = 0;//前面有p[i]个左括号  
                    left++;  
                }  
                squence[++loc] = 1;//当前位置赋以右括号  
            }  
            for (i = 1;i <= 2*n;i++)  
            {  
                cnt = 0;  
                if (squence[i])//只有在右括号的位置才输出  
                {  
                    flag[i] = true;  
                    for (j = i-1;j > 0;j--)  
                    {  
                        if ((flag[j] == false) && (squence[j] == 0))//表示找到了当前还没有匹配的左括号  
                        {  
                            flag[j] = true;  
                            for (k = i;k > j;k--)  
                            {  
                                cnt+=squence[k];//然后看匹配的括号之间有几个左括号  
                            }  
                            break;  
                        }  
                    }  
                    cout<<cnt<<" ";  
                }  
            }  
            cout<<endl;  
        }  
        return 1;     
    }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值