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;
}
原文地址:https://www.cnblogs.com/gpsx/p/5183235.html