【 题目描述 】
有了防护伞,并不能完全避免2012的灾难。地球防卫小队决定去求助外星种族的帮助。经过很长时间的努力,小队终于收到了外星生命的回信。但是外星人发过来的却是一串密码。只有解开密码,才能知道外星人给的准确回复。解开密码的第一道工序就是解压缩密码,外星人对于连续的若干个相同的子串“X”,会压缩为“[DX]”的形式(D是一个整数且1<=D<=99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类似于后面这种压缩之后再压缩的我们称之为二重压缩。如果是“[2[2[2CB]]]”,则是三重。现在我们给你外星人发送的密码,请你对其进行解压缩。
【 输入 】
一行字符串。
【 输出 】
解压后的字符串
【 样例输入 】
AC[3FUN]
【 样例输出 】
ACFUNFUNFUN
【提示】
【数据范围】
对于50%的数据:解压后的字符串长度在1000以内,最多只有三重压缩。
对于100%的数据:解压后的字符串长度在20000以内,最多只有十重压缩。
保证只包含数字、大些字母、“[”和“]”
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
string s;
string dfs(int l,int r){
int ll =0;
for (ll = l+1;ll <= r-1;ll++)
if (s[ll]=='[')
break;
if (ll==r){
int x = 0,i;
for (i = l+1;i <= r-1;i++)
if (s[i]>='0' && s[i] <= '9')
x = x*10+s[i]-'0';
else
break;
string t = s.substr(i,r-i);
string ss = "";
for (i = 1;i <= x;i++)
ss+=t;
return ss;
}
else{
int i,x = 0;
for (i = l+1;i<=r-1;i++)
if (s[i]>='0' && s[i]<='9')
x = x*10 + s[i]-'0';
else
break;
string ss = "",ts="";
for (int j = i;j<=r-1;j++)
if (s[j]=='['){
int jj = j+1;
int t = 1;
while (t!=0){
if (s[jj]==']') t--;
if (s[jj]=='[') t++;
if (t==0) break;
jj++;
}
ss+=dfs(j,jj);
j = jj;
}
else
ss+=s[j];
for (i = 1;i <= x;i++)
ts+=ss;
return ts;
}
}
int main(){
cin >> s;
int len = s.size();
for (int i = 0;i <= len-1;i++)
if (s[i]=='['{
int j = i+1;
int t = 1;
while (j <= len-1 && t!=0){
if (s[j]=='[') t++;
if (s[j]==']') t--;
if (t==0) break;
j++;
}
cout << dfs(i,j);
i = j;
}
else
putchar(s[i]);
return 0;
}
//(*^▽^*)