zoukankan      html  css  js  c++  java
  • HDU 1361 Parencodings(栈)

    题目链接

    Problem Description
    Let S = s1 s2 … s2n be a well-formed string of parentheses. S can be encoded in two different ways:
      • 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).
      • 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 file 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-sequence 4 5 6666 //某个左括号左边有几个左括号
    W-sequence 1 1 1456 //某个右括号与匹配的左括号间有几个左括号

    除了公式解答,也可以模拟。

    #include <cstdio>
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <cmath>
    #include <map>
    using namespace std;
    //#define LOCAL
    /*
    (((()()())))
    P-sequence      4 5 6666  //左边有几个左括号
    W-sequence      1 1 1456  //匹配的左括号间有几个左括号
    */
    stack<int> s;
    int main()
    {
    #ifdef LOCAL
        freopen("in.txt", "r", stdin);
    #endif // LOCAL
        int t,n,k,m;
        int i,j;
        cin>>t;
        bool flag[1000]= {false};
        for(i=0; i<t; i++)
        {
            cin>>n;
            memset(flag,0,1000);
            k=0;
            for(j=0; j<n; j++)
            {
                cin>>m;
                flag[k+m]=true;//k为右括号的数量(不含当前)
                k++;
            }
            for(j=0; j<k+m-1; j++)
            {
                if(!flag[j])s.push(j);
                else
                {
                    cout<<(j-s.top()+1)/2<<" ";//(右括号与相应的左括号序号差+1)/2,即为中间的左括号数
                    s.pop();
                }
            }
            cout<<(j-s.top()+1)/2<<endl;
            s.pop();
        }
        return 0;
    }
  • 相关阅读:
    QT Launching Debugger 卡住
    VS无法打开源文件"stdio.h"
    QT 5.15 https 无法访问 TLS initialization failed
    .Net 添加第三方控件
    XML解析——DOM解析
    javascript——对象
    SQL Server 合并表 union 和union all
    深入理解HTTP
    HTTP详解(3)-http1.0 和http1.1 区别
    HTTP详解(2)
  • 原文地址:https://www.cnblogs.com/gpsx/p/5183235.html
Copyright © 2011-2022 走看看