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