POJ1068 Parencodings
题意
描述
用两种编码模式描述正确的括号字符串S:
- P = p1 p2…pn 其中 pi 是 S中第 i 个右括号之前的左括号数。
- W = w1 w2…wn 其中wi是 S中第 i 个右括号和与其相匹配的左括号之间的右括号数(包含i,所以最少为 1)。本题要求要将输入的P序列转换为W序列。
输入
输入的第一行包含一个整数 t (1 <= t <= 10),即测试用例的数量,然后是每个测试用例的输入数据。每个测试用例的第一行是一个整数 n (1 <= n <= 20),第二行是一个格式良好的字符串的 P 序列。它包含n个正整数,用空格隔开,代表P序列。
输出
输出由与测试用例对应的恰好 t 行组成。对于每个测试用例,输出行应该包含 n 个整数,描述与其给定 P 序列对应的字符串的 W 序列。
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
思路
这道题被分类在模拟法里了,这道题思路很简单,用栈把每个左括号之前的右括号数量压进去,取出来的时候和此时的右括号计数比对输出就可以了。
提交代码
#include <stdio.h>
#include <stack>
using namespace std;
int main(){
int t;
int n;
int inputs[25];
int delta,tmp;
stack<int> s;
scanf("%d",&t);
for(int times = 0 ; times < t ; times++){
scanf("%d",&n);
for(int i = 0 ; i < n ; i++){
scanf("%d",&inputs[i]);
}
for(int i = 0 ; i < inputs[0]-1 ; i++){
s.push(0);
}
printf("1");
for(int i = 1 ; i < n ; i++){
delta = inputs[i] - inputs[i-1];
for(int j = 0 ; j < delta ; j++)
s.push(i);
tmp = s.top();s.pop();
printf(" %d",i - tmp + 1);
}
printf("\n");
}
}