POJ 1068 Parencodings

POJ 1068 Parencodings

[★★☆☆☆] 模拟 构造

  • 题目大意:

    一个括号表达式可以按照如下的规则表示,就是每个右括号之前的左括号数。
    比如(((()()()))),每个右括号之前的左括号数序列为P=4 5 6 6 6 6,而每个右括号所在的括号内包含的括号数为W=1 1 1 4 5 6.
    现在给定P,输出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

  • 解题思路:

    水题,根据P序列画出括号序列,再根据括号序列写出W序列。

  • 代码

#include <iostream>

using namespace std;

char S[50];
int sz;
int P[21];

int main() {
    int TT;
    cin >> TT;
    P[0] = 0;
    while (TT--) {
        sz = 0;
        int n; cin >> n;
        for (int i = 1; i <= n; i++) {
            cin >> P[i];
            for (int j = 1; j <= P[i]-P[i-1]; j++) {
                S[sz++] = '(';
            }
            S[sz++] = ')';
        }
        for (int i = 0; i < sz-1; i++) {
            if (S[i] == ')') {
                int res = 1;
                int t = 1;
                for (int j = i - 1; j >= 0; j--) {
                    if (S[j] == '(') {
                        t--;
                        if (t == 0) {
                            cout << res << ' ';
                            break;
                        }
                    }
                    if (S[j] == ')') {
                        t++; res++;
                    }
                }
            }
        }
        int i = sz-1;
        if (S[i] == ')') {
            int res = 1;
            int t = 1;
            for (int j = i - 1; j >= 0; j--) {
                if (S[j] == '(') {
                    t--;
                    if (t == 0) {
                        cout << res << endl;
                        break;
                    }
                }
                if (S[j] == ')') {
                    t++; res++;
                }
            }
        }

    }
}

你可能感兴趣的:(poj)