Poj 1068 Parencodings

本文解析了一道关于括号加密的问题,通过模拟方法还原原始字符串,并遍历该字符串求解W串。介绍了解题思路及C++实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击打开链接

题意:对于只含左右括号的字符串,有两种加密方法:

第一种:P串:代表当前右括号的左边有多少个左括号

第二种:W串:代表当前右括号中包含了多少个匹配的括号。

给你P串让你求W串。

题解:

我直接当模拟来处理,想求W串,不如先还原原来的字符串,然后遍历这个字符串,定义一个cnt表示有多少个右括号,当遍历到右括号时,cnt++,遍历到没有被匹配到的左括号的时候,跳出向左遍历,因为之前的括号已经被匹配上了,只用去匹配当前这个没有匹配上的右括号,然后并记录这个跟过程中有几个匹配的括号即可。

#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;

const int maxn = 25;
int a[maxn];
char s[maxn*3];
int book[maxn*3];
int main(){
	int z;
	scanf("%d",&z);
	while(z--){
		memset(book,0,sizeof(book));
		memset(a,0,sizeof(a));
		memset(s,0,sizeof(s));
		int n;
		scanf("%d",&n);
		for(int i = 1 ; i <= n ; i ++)
			scanf("%d",&a[i]);
		int ans = 0;
		for(int i= 0 ; i < a[1] ; i ++){
			s[ans++] = '(';
		}
		for(int i = 2 ; i <= n ; i ++){
			if(a[i-1] == a[i])
				s[ans++] = ')';
			else {
				s[ans++] = ')';
				for(int j = a[i-1] ; j < a[i] ; j ++)
					s[ans++] = '(';
			}
		}
		s[ans++] = ')';
		for(int i = 0 ; i < ans ; i ++){
			int cnt = 1;
			if(s[i] == ')'){
				for(int j = i - 1; j >= 0 ; j --){
					if(s[j] == ')')
						cnt ++;
					if(s[j] == '(' && (!book[j])){
						book[j] = 1;
						break;
					}
				}
				cout << cnt << " ";
			}
			
		}
		cout << endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值