2020.6.10
po一下解题报告证明我今天没偷懒。早上的闹钟+老爸的音乐让今天这起回笼觉引发的惨案格外壮烈,起来一看,艹,9点多了。然后赶紧起床锻炼,就来做题了。
这道题看见多重压缩我们很容易想到只需要将最内层的压缩字串解压,其余可以按照规则把字符串逐层解压递归就行。
这道题感觉有些膈应的地方是,虽然在一开始很容易就想到了子状态,但是却并不太好确定怎么将字符串正确地加起来。毕竟括号可以无限长,无限拓展,字符串地下标不好确定。后来看到有人说可以边读边做就恍然大雾了,这样连我手动模拟整数读入都省了。
代码:
#include <bits/stdc++.h>
using namespace std;
#define limit (100 + 5)//防止溢出
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f
#define lowbit(i) i&(-i)//一步两步
#define EPS 1e-6
#define FASTIO ios::sync_with_stdio(false);cin.tie(0);
#define ff(a) printf("%d\n",a );
#define pi(a,b) pair<a,b>
#define rep(i, a, b) for(int i = a; i <= b ; ++i)
#define per(i, a, b) for(int i = b ; i >= a ; --i)
#define mint(a,b,c) min(min(a,b), c)
#define MOD 998244353
#define FOPEN freopen("C:\\Users\\tiany\\CLionProjects\\acm_01\\data.txt", "rt", stdin)
typedef long long ll;
typedef unsigned long long ull;
ll read(){
ll sign = 1, x = 0;char s = getchar();
while(s > '9' || s < '0' ){if(s == '-')sign = -1;s = getchar();}
while(s >= '0' && s <= '9'){x = x * 10 + s - '0';s = getchar();}
return x * sign;
}//快读
void write(ll x){
if(x < 0) putchar('-'),x = -x;
if(x / 10) write(x / 10);
putchar(x % 10 + '0');
}
int n,m;
string str;
string dfs() {
string ans;
char s;
while (scanf("%c" , &s) == 1){
if(s == '['){
//如果这个是一层压缩
int num;
scanf("%d", &num);
string tmp = dfs();
rep(i ,1, num)ans += tmp;
}else if(isalpha(s)){
ans += s;
}else{
return ans;//另一半个括号
}
}
return ans;
}
int main() {
#ifdef LOCAL
FOPEN;
#endif
printf("%s", dfs().c_str());
return 0;
}