[POJ1068]Parencodings

[POJ1068]Parencodings

试题描述

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. 

输入

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.

输出

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.

输入示例

2
6
4 5 6 6 6 6
9
4 6 6 6 6 8 9 9 9

输出示例

1 1 1 4 5 6
1 1 2 4 5 1 1 3 9

数据规模及约定

见“输入

题解

用个栈胡乱搞搞。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <set>
using namespace std;

const int BufferSize = 1 << 16;
char buffer[BufferSize], *Head, *Tail;
inline char Getchar() {
    if(Head == Tail) {
        int l = fread(buffer, 1, BufferSize, stdin);
        Tail = (Head = buffer) + l;
    }
    return *Head++;
}
int read() {
    int x = 0, f = 1; char c = Getchar();
    while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
    while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
    return x * f;
}

#define maxn 50
int n, S[maxn], top;

int main() {
	int T = read();
	while(T--) {
		n = read();
		int lst = 0; top = 0;
		for(int i = 1; i <= n; i++) {
			int x = read();
			for(int j = 1; j <= top; j++) S[j] += x - lst;
			for(int j = x - lst; j; j--) S[++top] = j;
			printf("%d%c", S[top--], i < n ? ' ' : '\n');
			lst = x;
		}
	}
	
	return 0;
}

 

posted @ 2016-11-26 22:26  xjr01  阅读(314)  评论(0编辑  收藏  举报