POJ 1068 Parencodings 模拟

题意:对每一个括号串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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值