P1928 外星密码题解

题目

有了防护伞,并不能完全避免2012的灾难。地球防卫小队决定去求助外星种族的帮助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压缩密码,外星人对于连续的若干个相同的子串X会压缩为[DX]的形式(D是一个整数且1≤D≤99),比如说字符串CBCBCBCB就压缩为[4CB]或者[2[2CB]],类似于后面这种压缩之后再压缩的称为二重压缩。如果是[2[2[2CB]]][则是三重的。现在我们给你外星人发送的密码,请你对其进行解压缩。

输入输出格式

输入格式

输入一行,一个字符串,表示外星人发送的密码。

输出格式

输出一行,一个字符串,表示解压缩后的结果。

输入输出样例

输入样例

AC[3FUN]

输出样例

ACFUNFUNFUN

解析

假设只有一层方括号,那么只需要找到方括号,就可以读到重复次数,然后将该重复的部分拼接指定的次数后还原。把一对方括号作为“压缩区”。如果方括号的“重复部分“里还有方括号呢?没关系,设法把里面的方括号继续展开即可。因此可以写成递归函数,代码如下:

#include<iostream>
#include<string>
using namespace std;
string expand(){
	string s="",x;
	char c;int D;
	while(cin>>c){//持续输入字符,直到全部读完 
		if(c=='['){//发现一个压缩区 
			cin>>D;
			x=expand(); //递归地读入x 
			while(D--){//重复D次x并进行拼接 
			    s+=x;
		    }
		}
        else if(c==']'){//压缩区结束,返回已经处理好的x 
        	return s;
		}
		else{//如果不是'['和']',那还是x的字符,加进去即可 
			s+=c;
		}
	}
	return s;
}
int main(){
	cout<<expand();
	return 0;
}
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

互联网的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值