zoukankan      html  css  js  c++  java
  • Poj OpenJudge 1068 Parencodings

    1.Link:

    http://poj.org/problem?id=1068

    http://bailian.openjudge.cn/practice/1068

    2.Content:

    Parencodings
    Time Limit: 1000MS   Memory Limit: 10000K
    Total Submissions: 20077   Accepted: 12122

    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

    Source

    3.Method:

    (1)先将P-sequence转成S序列,方法为:利用vector保存,置入)前,放入当前数值减前一数值的(

    (2)将S序列转为W序列,方法为:利用stack,每次遇到(则置入stack,其中-1代表“(”;遇到count = 1,直到遇到第一个(前,将stack的值累加到count,并置出

    4.Code:

     1 #include <iostream>
     2 #include <vector>
     3 #include <stack>
     4 
     5 using namespace std;
     6 
     7 int main()
     8 {
     9     //freopen("D://input.txt","r",stdin);
    10 
    11     int i,j;
    12 
    13     int t;
    14     cin >> t;
    15     while(t--)
    16     {
    17         int n;
    18         cin >> n;
    19 
    20         int *arr_p = new int[n];
    21 
    22         for(i = 0; i < n; ++i) cin >> arr_p[i];
    23 
    24         //for(i = 0; i < n; ++i) cout << arr_p[i] << endl;
    25 
    26 
    27         vector<char> v_sym;
    28 
    29         int pre_p = 0;
    30         for(i = 0; i < n; ++i)
    31         {
    32             for(j = pre_p; j < arr_p[i]; ++j) v_sym.push_back('(');
    33             v_sym.push_back(')');
    34             pre_p = arr_p[i];
    35         }
    36 
    37         vector<char>::size_type sym_i;
    38 
    39         //for(sym_i = 0; sym_i != v_sym.size(); ++sym_i) cout << v_sym[sym_i];
    40         //cout << endl;
    41 
    42         stack<int> s_sym;// -1 (, -2 )
    43         for(sym_i = 0; sym_i != v_sym.size(); ++sym_i)
    44         {
    45             if('(' == v_sym[sym_i]) s_sym.push(-1);
    46             else
    47             {
    48                 int count = 1;
    49                 while(s_sym.top() != -1)
    50                 {
    51                     count += s_sym.top();
    52                     s_sym.pop();
    53                 }
    54                 s_sym.pop();
    55                 cout << count << " ";
    56                 s_sym.push(count);
    57             }
    58         }
    59         cout << endl;
    60 
    61 
    62 
    63         delete [] arr_p;
    64 
    65 
    66     }
    67 
    68     return 0;
    69 }

    5.Reference:

  • 相关阅读:
    手机的基本功能测试情景模式
    C#.net技术内幕04集合
    .net 发送电子邮件
    SQL:select case when(转)
    《 C#技术内幕》学习01IDisposable
    C#.net技术内幕03字符串
    点击确定后页面跳转
    SQL注入式攻击
    C#.NET技术内幕 02表达式
    window xp自带的功能之繁体字
  • 原文地址:https://www.cnblogs.com/mobileliker/p/4067816.html
Copyright © 2011-2022 走看看