Parencodings(括号匹配)

版权声明:转载请注明出处:https://blog.csdn.net/qq1013459920 https://blog.csdn.net/qq1013459920/article/details/83042340

                                        Parencodings

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 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 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

题意:t组输入数据,每组数据第一行为n,第二行为p1,p2,p3,pi,代表第i个右括号左边出现了pi个左括号(可惜本蒟蒻对英文题理解能力比较差,理解了很久的题意...,更崩溃的是12次SF)

例如样例1:

S ( ( ( ( ) ( ) ( ) ) ) ) 
P-sequence  4 5 6 6 6 6
W-sequence 1 1 1 4 5 6

输入:”4代表第一个右括号左边有4个左括号,第二个右括号左边有5个左括号,依次类推,即可以模拟得出括号字符串。

输出:1代表第一个右括号与左括号内的左右括号匹配数(包括其本身)

第一个右括号:()  为1          第二个 右括号 :()还是 1   第三右括号个 () 1 第四个右括号 (()()()),总共4个左右括号匹配(包含其本身) 依次类推

AC Code:

#include<iostream>
#include<sstream>
#include<cstdlib>
#include<cmath>
#include<ctype.h>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<list>
#define mod 998244353
#define Max 0x3f3f3f3f
#define Min 0xc0c0c0c0
#define mst(a) memset(a,0,sizeof(a))
#define f(i,a,b) for(int i=a;i<b;i++)
using namespace std;
typedef long long ll;
const int maxn=105;
char str[maxn];
int arr[maxn], dis[maxn];
int main(){
    ios::sync_with_stdio(false);
    int t, n;
    cin>>t;
    while(t--){
        cin>>n;
        memset(str,'(', sizeof(str));   //初始化字符串全为'('
        mst(arr);
        mst(dis);
        for(int i = 1; i<= n; i++){
            cin>>arr[i];
            if(i != 1){         
                dis[i] = dis[i - 1] + arr[i] - arr[i - 1] + 1;  //记录每一个右括号离字符串起点的距离
            }
            else {
                dis[i] = arr[i] + 1;        //记录第一个右括号离起点距离
            }
        }
        for(int i = 1; i <= n; i++){
            str[dis[i]] = ')';          //把右括号加进字符串
        }
        for(int i = 1; i <= n; i++){    //模拟字符串匹配
            int cur1 = 0, cur2 = 0;
            for(int j = dis[i]; j >= 1; j--){   //从第一个右括号开始统计匹配括号数
                if(str[j] == '('){
                    cur1++;
                }
                if(str[j] == ')'){
                    cur2++;
                }
                if(cur1 == cur2){       //匹配完毕
                    break;
                }
            }
            cout<<cur2;
            if(i != n){
                cout<<" ";
            }
        }
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq1013459920/article/details/83042340
今日推荐