• Parencodings


    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
    

    这个题理解了题意就不难了
    输入2 6 不解释
    4 5 6 6 6 6
    可以这样理解
    (((()()())))
    第一个右括号左边有4个左括号
    第二个右括号左边有5个左括号
    以此类推;
    所以根据所给出的数字串;很容易还原括号;
    输出时:(((()()())))

    一个完整的()输出1;共3个
    (()()())这个输出4一个()有3个(),3+1;

    一句话就是
    比如(((()()()))),
    输入:每个右括号之前的左括号数序列为P=4 5 6 6 6 6,;
    输出:每个右括号所在的括号内包含的括号数为W=1 1 1 4 5 6.

    可以利用 栈和队列
     1 #include<iostream>
     2 #include<queue>
     3 #include<stack>
     4 #include<cstdio>
     5 using namespace std;
     6 int main()
     7 {
     8     queue<char>p,q;
     9     stack<char>Q;
    10     int a,b,c,m,n;
    11     cin>>n;
    12     while(n--)
    13     {
    14         cin>>m;
    15         b=0;
    16         while(m--)
    17         {
    18             cin>>a;
    19             c=a-b;//制定压入的左括号的数目
    20             b=a;
    21             while(c--)
    22                 p.push('(');
    23             p.push(')');//每次压入左括号之后压入一个右括号
    24         }
    25         while(!p.empty())//将队列中的括号一个个取出
    26         {
    27             if(p.front()=='(')
    28                 Q.push(p.front());//如果是左括号直接压入栈中
    29             
    30             else if(p.front()==')')//如果是右括号,则进行判断
    31             {
    32                 if(Q.top()=='(')//如果栈顶元素是左括号
    33                 {
    34                     Q.pop();//出栈
    35                     Q.push(1);//压入 1
    36                     q.push(1);//这是为了把数字储存下来,方便以后输出答案
    37                 }
    38                 else//如果栈顶元素不是左括号
    39                 {
    40                     int sum=1;
    41                     while(Q.top()!='(')//持续出栈  直到左括号
    42                     {
    43                         sum+=Q.top();//统计一共包含多少左括号
    44                         Q.pop();
    45                     }
    46                     Q.pop();//左括号出栈
    47                     q.push(sum);//这是为了把数字储存下来,方便以后输出答案
    48                     Q.push(sum);//压入括号个数
    49                 }
    50             }
    51             p.pop();
    52         }
    53         printf("%d",q.front());
    54         q.pop();
    55         while(!q.empty())
    56         {
    57             printf(" %d",q.front());
    58             q.pop();
    59         }
    60         printf("
    ");
    61     }
    62     return 0;
    63 }
    View Code


  • 相关阅读:
    性能分析一:查看程序占用系统的内存 .
    Winform中ToolTip的用法
    30岁的程序员
    序列化
    CMD中可执行的结束进程命令
    数据库设计规范与技巧
    判断字符串编码思路
    字符串加密思路
    在同一个页面施用多个不同的jQuery版本而不冲突的方法
    mysql 数据库设计
  • 原文地址:https://www.cnblogs.com/kongkaikai/p/3241864.html
Copyright © 2020-2023  润新知