zoukankan      html  css  js  c++  java
  • poj 1068Parencodings

    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矩阵,要求w的值。。
    做完看到网上好多推出什么公式的。。我是直接用数组模拟的,先将所有的括号形式都存到数组中,然后在从后往前找与之匹配的,算出w的值,不算很好的方法,但是感觉应该好理解些。。
    View Code
     1 #include <stdio.h>
     2 #include <string.h>
     3 int main()
     4 {
     5     int t,n;
     6     int i,j,k;
     7     int p[22],w[22],s[100];
     8     scanf("%d",&t);
     9     while(t--)
    10     {
    11         scanf("%d",&n);
    12         for(i=0; i<n; i++)
    13             scanf("%d",&p[i]);
    14         for(i=0; i<p[0]; i++)
    15             s[i]=-1;
    16         s[i++]=1;
    17         for(j=1; j<n; j++)
    18         {
    19             for(k=0; k<p[j]-p[j-1]; k++)
    20                 s[i++]=-1;
    21             s[i++]=1;
    22         }
    23         //for(j=0;j<i;j++)
    24         //printf("%d",s[j]);
    25         i=n-1;
    26         for(j=2*n-1; j>=0; j--)
    27         {
    28             if(s[j]==1)
    29             {
    30                 int sum=0;
    31                 for(k=j;; k--)
    32                 {
    33                     sum+=s[k];
    34                     if(sum==0)
    35                         break;
    36                 }
    37                 w[i--]=(j-k+1)/2;
    38             }
    39         }
    40         printf("%d",w[0]);
    41         for(j=1; j<n; j++)
    42             printf(" %d",w[j]);
    43         printf("\n");
    44     }
    45     return 0;
    46 }


  • 相关阅读:
    C—动态内存分配之malloc与realloc的区别
    C++动态内存管理之深入探究new和delete
    Linux粘滞位的设置
    linux—find指令常见用法示例
    Linux系统date命令的参数及获取时间戳的方法
    Linux系统文件的三个重要时间详解
    《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---27
    《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---26
    《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---25
    《Linux命令行与shell脚本编程大全 第3版》Shell脚本编程基础---24
  • 原文地址:https://www.cnblogs.com/wilsonjuxta/p/2953729.html
Copyright © 2011-2022 走看看