POJ 1068--Parencodings

2017-10-05

原题链接

题目大意:

给出一串数字(P-sequence),分别表示一个仅由两两配对的左右括号队列(S)中,每个右括号之前的左括号数目。求位于每个右括号以及与它配对的左括号之间的右括号的数目(W-sequence)。

示例:

        S       (((()()())))

    P-sequence      4 5 6666

    W-sequence      1 1 1456

样例输入:

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

本题的关键在于记录括号的配对情况,因为一个左括号必然对应到一个右括号,所以把未配对的左括号位置压入堆栈,每出现一个右括号,即弹出栈顶(也就是离它最近的左括号)位置,便能方便地求出符合条件的右括号数目。

参考题解

代码:

#include <iostream>
#include <stack>
using namespace std;
bool Pqueue[1000];  //构造括号队列
stack<int> paren;

int main() {
    //kaseNum:输入样例组数;  everyNum:每组输入样例的数据个数;
    int kaseNum,everyNum;
    cin >> kaseNum;
    while(kaseNum > 0) {
        //这里对Pqueue进行初始化是必须的,因为Pqueue是全局变量
        memset(Pqueue,false,sizeof(Pqueue));
        cin >> everyNum;
        int tp,i;
        int Rnum = 0;   //记录右括号的个数
        for(i = 0; i < everyNum; i++) {
            cin >> tp;
            //记录右括号的位置
            Pqueue[tp+Rnum] = true;
            Rnum++;
        }
        for(i = 0; i < Rnum+tp-1; i++) {
            if(!Pqueue[i]) {
                paren.push(i);
            }
            else
            {
                cout << (i - paren.top() + 1) / 2 << " ";
                paren.pop();
            }
        }
        cout << (i - paren.top() + 1) / 2 << endl;
        paren.pop();

        --kaseNum;
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值