zoukankan      html  css  js  c++  java
  • POJ 1068 (13.10.11)

    Parencodings
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 17713   Accepted: 10660

    Description

    Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways:
    q By an integer sequence P = p1 p2...pn where pi is the number of left parentheses before the ith right parenthesis in S (P-sequence).
    q By an integer sequence W = w1 w2...wn where for each right parenthesis, say a in S, we associate an integer which is the number of right parentheses counting from the matched left parenthesis of a up to a. (W-sequence).

    Following is an example of the above encodings:
    	S		(((()()())))
    
    	P-sequence	    4 5 6666
    
    	W-sequence	    1 1 1456
    
    

    Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.

    Input

    The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case is an integer n (1 <= n <= 20), and the second line is the P-sequence of a well-formed string. It contains n positive integers, separated with blanks, representing the P-sequence.

    Output

    The output file consists of exactly t lines corresponding to test cases. For each test case, the output line should contain n integers describing the W-sequence of the string corresponding to its given P-sequence.

    Sample Input

    2
    6
    4 5 6 6 6 6
    9 
    4 6 6 6 6 8 9 9 9
    

    Sample Output

    1 1 1 4 5 6
    1 1 2 4 5 1 1 3 9


    题意: 给出字符串的表达式P, 得到另一种表达式W

    表达式P的规则是这样的: P1, P2, Pi...Pn, Pi表示的是, 第i个右括号左边有Pi个左括号

    表达式W的规则是这样的: W1, W2, Wi...Wn, Wi表示的是, 第i个右括号与其对应的左括号形成的一对括号中, 有几对括号, 包括自己本身;


    做法: 由P规则得出字符串, 再由该字符串从左至右逐个找右括号, 一对一对查, 查一对, 标记成"##", 以便下次查的时候不会重复, 以及可以得知这里已有一对括号, 便于统计


    AC代码:

    #include<stdio.h>
    
    int main() {
        int t;
        scanf("%d", &t);
        while(t--) {
            char str[50];
            int ans[50];
            int n, formal, now;
            scanf("%d", &n);
            n--;
            scanf("%d", &formal);
            int i, pos;
            for(pos = 0; pos < formal; pos++)
                str[pos] = '(';
            str[pos] = ')';
            while(n--) {
                scanf("%d", &now);
                int num;
                num = now - formal + pos + 1;
                for(i = pos+1; i < num; i++)
                    str[i] = '(';
                str[i] = ')';
                pos = i;
                formal = now;
            }
            int count;
            int tpos = 0;
            for(i = 0 ; i <= pos; i++) {
                count = 0;
                if(str[i] == ')') {
                    for(int j = i-1; j >= 0; j--) {
                        if(str[j] == '#')
                            count++;
                        if(str[j] == '(') {
                            str[j] = '#';
                            str[i] = '#';
                            break;
                        }
                    }
                    ans[tpos++] = (count / 2) + 1;
                }
            }
            for(int i = 0; i < tpos; i++) {
                if(i != tpos-1)
                    printf("%d ", ans[i]);
                else
                    printf("%d
    ", ans[i]);
            }
        }
        return 0;
    }
  • 相关阅读:
    第二阶段冲刺站立会议报告
    09软件工程读后感之三
    08软件工程读后感之二
    07软件工程读后感之一
    一个整数数组中最大字数组二
    返回一个二维数组最大联通子数组的和
    项目阶段总结
    大道至简阅读笔记之三
    大道至简阅读笔记二
    课堂设计
  • 原文地址:https://www.cnblogs.com/phisy/p/3363286.html
Copyright © 2011-2022 走看看