2020.03.15日常总结

洛谷P1928     外星密码\color{green}{\text{洛谷P1928\ \ \ \ \ 外星密码}}

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

【数据范围】:

  • 对于 50%50\% 的数据:解压后的字符串长度在 10001000 以内,最多只有三重压缩。

  • 对于 100%100\% 的数据:解压后的字符串长度在 2000020000 以内,最多只有十重压缩。保证只包含数字、大写字母、[]

\color{blue}{【思路】:} 因为最多只有 1010 重的压缩,所以我们可以从此入口。记 SiS_i 表示第 ii 重的压缩展开后的结果,我们可以如此计算它(depdep 表示当前是第 depdep 重的压缩):

  • 如果当前字符是一个字母的话,直接把它放至 SdepS_{dep} 的最后一位。
  • 如果当前字符是 [,代表我们可以了新的一层压缩,我们可以先取出 DD,然后把 Sdep+1S_{dep+1} 求出。第 dep+1dep+1 层压缩对 SdepS_{dep} 的贡献就是 numnumSdep+1S_{dep+1},直接把 numnumSdep+1S_{dep+1} 放入 SdepS_{dep} 的后面即可。

考虑到递归的层数很小(只有 1010),所以我们可以用递归解决问题。

\color{blue}{【代码】:}
2020.03.15日常总结
2020.03.15日常总结