题意:对每一个括号串S (((()()())))。P-sequence :4 5 6666 表示第k个右括号之前的左括号个数。W-sequence :1 1 1456 表示每个右括号以及与它匹配的左括号之间的左括号个数。给出P-sequence求W-sequence。
#include <cstring>
#include <iostream>
using namespace std;
struct item
{
bool paren, check;
} S[41];
int main()
{
int t, n, num, cnt, i, j, k;
cin >> t;
while ( t-- )
{
cin >> n;
memset(S,0,sizeof(S));
for ( i = 0; i < n; i++ )
{
cin >> num;
S[num+i].paren = 1; /* 右括号标记为1 */
}
for ( i = k = 0; k < n; k++ )
{
cnt = 0; /* cnt 用来统计左括号的个数 */
while ( i < 2 * n && S[i].paren == 0 ) i++; /* 寻找右括号 */
for ( j = i - 1 ; j >= 0; j-- ) /* 从右括号所在位置向左寻找它所匹配的左括号 */
{
if ( S[j].paren == 0 )
{
cnt++; /* 若s[j]是左括号,则cnt加1 */
if ( S[j].check == 0 ) /* 若s[j]是左括号且未被匹配,那么找到匹配 */
{
S[j].check = 1;
break;
}
}
}
cout << cnt << ' ';
i++;
}
cout << endl;
}
return 0;
}