难度:普及/提高-
题目描述
有了防护伞,并不能完全避免 2012 的灾难。地球防卫小队决定去求助外星种族的帮助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压缩密码,外星人对于连续的若干个相同的子串 XX 会压缩为 [DX][DX] 的形式(D 是一个整数且 1≤D≤99),比如说字符串 CBCBCBCB 就压缩为 [4CB] 或者[2[2CB]],类似于后面这种压缩之后再压缩的称为二重压缩。如果是 [2[2[2CB]]] 则是三重的。现在我们给你外星人发送的密码,请你对其进行解压缩。
输入格式
输入一行,一个字符串,表示外星人发送的密码。
输出格式
输出一行,一个字符串,表示解压缩后的结果。
输入输出样例
输入 #1
AC[3FUN]
输出 #1
ACFUNFUNFUN
说明/提示
【数据范围】
对于 50% 的数据:解压后的字符串长度在 1000 以内,最多只有三重压缩。
对于 100% 的数据:解压后的字符串长度在 20000 以内,最多只有十重压缩。保证只包含数字、大写字母、[
和 ]
。
思路
如果读到左中括号,则进入递归,对下一层进行解压,直到碰到右中括号。除此之外还要特判有些字符不需要参与下一层的解压。
完整代码
#include<bits/stdc++.h> //万能头文件
using namespace std; //标准命名空间
string f(){ //定义一个函数,为string类型
string ans = ""; //初始化
char ch;
while (cin>>ch){ //一直输入除非Ctrl+z
if (ch == '\n')break; //当遇到换行时,退出循环
else if (ch == '['){
int num;
cin >> num;
string tmp = f();
for (int i = 1; i <= num; i++){
ans += tmp;
}
}
else if (ch == ']')return ans; //当遇到']'时,返回ans的值
else ans += ch; //如果不是'['和']',那就是X的一个字符,所以加进X
}
return ans;
}
int main()
{
cout << f() << endl;
return 0;
}