题目来源:http://poj.org/problem?id=1068
问题描述
Parencodings
Description Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways:
S (((()()())))
P-sequence 4 5 6666
W-sequence 1 1 1456
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 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. 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 Source |
------------------------------------------------------------
题意
给定一个由(和)组成的式子,其中(和)各有n个,约定
表达1:长度为n的整数数组,数组的第i个元素表示第i个)之前的(总数
表达2:长度为n的整数数组,数组的第i个元素表示与第i个)匹配的(与第i个)之间的)总数(包括第i个)在内)
问题是:给定表达1,计算表达2
------------------------------------------------------------
思路
暴力模拟
用表达1根据定义计算原括号串——O(n)
再通过括号串根据定义计算表达2——O(n^2)
------------------------------------------------------------
代码
#include<cstdio>
#include<vector>
int p[25] = {};
int w[25] = {};
char str[45] = {};
std::vector<int> st;
int main()
{
#ifndef ONLINE_JUDGE
freopen("1068.txt", "r", stdin);
#endif
int t, i, j, k, n, cnt;
scanf("%d", &t);
while (t--)
{
st.clear();
scanf("%d", &n);
for (i=0; i<n; i++)
{
scanf("%d", p+i);
}
// 从p恢复出括弧串str
i = 0;
j = 0;
k = 0;
while (i<2*n)
{
while (j<p[k])
{
str[i++] = '(';
j++;
}
k++;
str[i++] = ')';
}
// 从括号串str计算w
for (i=0; i<2*n; i++)
{
if (str[i] == '(')
{
st.push_back(i);
}
else
{
j = st.back();
st.pop_back();
cnt = 0;
for (k = j+1; k <= i; k++)
{
if (str[k] == ')')
{
cnt++;
}
}
printf("%d ", cnt);
}
}
printf("\n");
}
return 0;
}