POJ1068 Parencodings(模拟)

题目链接

分析:

水题。

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int maxn = 100;

int P[maxn], W[maxn];
char s[maxn];

int main(){
    int T, n, m;

    scanf("%d", &T);

    while(T--) {
        scanf("%d", &n);
        P[0] = 0;
        for(int i=1; i<=n; i++) scanf("%d", &P[i]);

        //通过P推s
        int cn = 0;
        for(int i=1; i<=n; i++) {
            for(int j=0; j<P[i]-P[i-1]; j++) {
                s[cn++] = '(';
            }
            s[cn++] = ')';
        }
        s[cn++] = '\0';

        //通过s推W
        int rp_cnt = 0, lp_cnt, t, ls_cnt;

        for(int i=0; i<cn; i++) {
            if(s[i] == ')') {
                rp_cnt++;
                lp_cnt = t = ls_cnt = 0;
                for(int j=i; j>=0; j--) {
                    if(s[j] == ')') { t++; ls_cnt++; }
                    else if(s[j] == '(') lp_cnt++;
                    if(lp_cnt == ls_cnt) break;
                }
                W[rp_cnt] = t;
            }
        }

        for(int i=1; i<=n; i++) {
            if(i != n) printf("%d ", W[i]);
            else printf("%d\n", W[i]);
        }
    }

    return 0;
}

 

posted on 2013-06-22 14:43  Still_Raining  阅读(158)  评论(0编辑  收藏  举报