poj1068 Parencodings 模拟水题

///2014.3.8
///poj1068

//time:0MS

/**
 *对于给出的原括号串,存在两种数字密码串:
 *1.p序列:当出现匹配括号对时,
 *  从该括号对的右括号开始往左数,
 *  直到最前面的左括号数,就是pi的值。
 *2.w序列:当出现匹配括号对时,
 *  包含在该括号对中的所有右括号数(包括该括号对),
 *  就是wi的值。
 *题目的要求:对给出的p序列,求出对应的w序列。
 */

#include <iostream>
#include <cstdio>
#include <cstring>
#include <deque>
using namespace std;

int main( )
{
//    freopen("in","r",stdin);
//    freopen("out","w",stdout);

    int T;   ///case数
    scanf("%d",&T);
    while( T-- ){
        int n;
        scanf("%d",&n);
        int seq[n];   ///存储输入的p序列
        for(int i=0 ; i<n ; i++)
            scanf("%d",&seq[i]);

        ///用p序列还原括号序列
        deque<char> parentheses;
        int existing = 0;
        for(int i=0 ; i<n ; i++){
            for(int j=existing ; j<seq[i] ; j++){
                parentheses.push_back('(');
                existing++;
            }
            parentheses.push_back(')');
        }

        ///输出w序列
        bool used[2*n];
        memset(used,0,sizeof(bool)*2*n);
        for(int i=0 ; i<parentheses.size() ; i++){
            if( parentheses[i]==')' ){
                int num = 0;
                for(int j=i-1 ; j>=0 ; j--){
                    if( used[j] && parentheses[j]=='(' ){
                        num++;
                    }
                    if( !used[j] && parentheses[j]=='(' ){
                        num++;
                        used[j] = true;
                        break;
                    }
                }
                printf("%d ",num);
            }
        }
        cout<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值