圆括号编码
1.题目描述
题目描述
令S=s1 s2 ...sn是一个规则的圆括号字符串。S以2种不同形式编码:
(1)用一个整数序列P=p1 p2 ... pn编码,pi代表在S中第i个右圆括号的左圆括号数量。(记为P-序列)
(2)用一个整数序列W=w1 w2 ... wn编码,对每一个右圆括号a,从与之匹配的左圆括号开始到a之间的右圆括号的数目用wi表示。(记为W-序列)
例如:
S为:(((()()())))
P-序列 4 5 6 6 6 6
W-序列 1 1 1 4 5 6
编程把一个圆括号串S的P-序列转化为W-序列。
输入
第一行是一个整数t(1 <= t <= 10),表示测试数据的组数。接下来是每组测试数据。每个测试数据的第1行是一个整数n(1 <= n <= 20),第2行是一个圆括号串的P-序列,包含n个正整数,以空格隔开。
输出
输出t行,对每个测试数据所表示的P-序列,输出对应的W-序列,占一行,包含n个整数。
样例输入
3
5
4 5 5 5 5
6
4 5 6 6 6 6
9
4 6 6 6 6 8 9 9 9
样例输出
1 1 3 4 5
1 1 1 4 5 6
1 1 2 4 5 1 1 3 9
2.完整代码
c
#include <stdio.h>
int P[21];
int W[21];
//p[i]与p[j]的差就是二者之间的左括号数量
int main()
{
int t,n;
P[0] = 0;//p[0]和w[0]都初始化为0,因为第0个右括号前没有左括号
W[0] = 0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i = 1 ;i <= n;i++)
{
scanf("%d",&P[i]);
int j = i - 1;
int count = 1;
while(P[i] - P[j] < i - j)//此条件说明与当前下标i匹配的左圆括号在j的左侧,需要继续往左找
//这个控制条件不同意想到
{
j--;
count++;
}
W[i] = count;
}
//输出W序列
for(int i= 1; i <= n;i++)
{
if(i < n)
printf("%d ",W[i]);
else
printf("%d\n",W[i]);
}
}
return 0;
}