#G3010. 字符串压缩

字符串压缩

题目描述

为了节省短信的字数,小红发明了一种「压缩」方法:把字符串中连续相同的一段字母写成「这个字母 + 它连续出现的次数」;如果某个字母只连续出现了 11 次,就只写字母,不写数字。

例如:

  • aaabcc 压缩后是 a3bc2;
  • xxxxxxxxxxxxy(1212 个 x 和 11 个 y)压缩后是 x12y。

现在你要帮小红编写一个程序,它有两种功能:

  • 功能 1:给出原来的字符串,输出压缩后的字符串;
  • 功能 2:给出一个压缩后的字符串,把它还原成原来的字符串。

输入格式

第一行一个整数 opop(op=1op = 1 或 op=2op = 2),表示要使用的功能。

第二行一个字符串 ss,只包含小写字母和数字。

  • 若 op=1op = 1,ss 是原字符串,只包含小写字母;
  • 若 op=2op = 2,ss 是压缩后的字符串,保证它是某个原字符串按上述规则压缩得到的。

输出格式

一行一个字符串,表示压缩(op=1op = 1)或还原(op=2op = 2)的结果。

样例 #1

样例输入 #1

1
aaabccddddddddddddx

样例输出 #1

a3bc2d12x

样例 #2

样例输入 #2

2
x2yz10

样例输出 #2

xxyzzzzzzzzzz

样例解释

样例 1:aaa → a3,b → b,cc → c2,1212 个 d → d12,x → x。

样例 2:x2 → xx,y → y,z10 → 1010 个 z。注意次数可能是两位或更多位的数。

提示

数据范围

记原字符串(压缩前)的长度为 LL。

  • 对于 50%50\% 的数据:op=1op = 1;
  • 对于另外 20%20\% 的数据:op=2op = 2,且压缩串中每个次数都只有一位数字;
  • 对于 100%100\% 的数据:1≤L≤1051 \le L \le 10^5。

提示

  • 功能 1:用一个下标 ii 从左往右走,每次再用一个下标 jj 往后数出和 s[i] 相同的有多少个,处理完后让 ii 跳到 jj。
  • 功能 2:读到一个字母后,把它后面连续的数字字符拼成一个整数(k = k * 10 + (c - '0')),没有数字就表示 11 次。
  • 把整数变成字符串可以用 to_string。