使用字符串模拟和最长连续段扫描。
将输入按冒号切成 8 个字符串组。压缩时先执行规则 2,再执行规则 1。
可被 ** 压缩的候选段需要满足:
该段由若干个连续相同的组组成,并且这个组本身 4 位字符完全相同,例如 0000、1111、aaaa。
标准的数字标识符由 128 位组成,通常表示为 8 组 4 位小写十六进制数,每组之间用冒号 : 分隔。例如:
2001:0db8:85a3:0000:0000:8a2e:0370:7334
为了提高可读性,需要对数字标识符进行压缩。
每组 4 位小写十六进制数中,前导的零可以省略。
例如:
0db8 -> db8
0370 -> 370
0000 -> 0
连续的相同数字组可以用双星号 ** 表示,但只能使用一次。
这里的“相同数字组”指的是这一组 4 位字符完全相同,且每一位都是同一个字符,例如:
0000、1111、aaaa、ffff、2222
例如:
2001:aaaa:bbbb:cccc:dddd:eeee:ffff:2222
可以压缩为:
2001:**:bbbb:cccc:dddd:eeee:ffff:2222
注意:如果有多个连续相同数字组,只能压缩最长的一组;如果长度相同,压缩最左边的一组。
首先应用规则 2,即连续相同数字组压缩;然后应用规则 1,即前导零压缩。
例如:
2001:0011:2222:3333:1111:0000:0000:1111
先压缩连续的 0000:0000,再压缩前导零,结果为:
2001:11:2222:3333:1111:**:1111
输入一个字符串 identifier,表示数字标识符。
输入保证:
identifier 是完整且有效的标准数字标识符: 分隔输出压缩后的数字标识符字符串。
| 输入 | 输出 |
|---|---|
2001:0db8:85a3:0010:0001:8a2e:0370:7334 |
2001:db8:85a3:10:1:8a2e:370:7334 |
1111:2222:2222:3333:4444:5555:6666:7777 |
1111:**:3333:4444:5555:6666:7777 |
0001:0002:0003:0004:0005:0006:0007:0008 |
1:2:3:4:5:6:7:8 |
2222:2222:aaaa:bbbb:2222:2222:cccc:dddd |
**:aaaa:bbbb:2222:2222:cccc:dddd |
2001:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:2222 |
2001:**:2222 |
输入
2001:0db8:85a3:0010:0001:8a2e:0370:7334
输出
2001:db8:85a3:10:1:8a2e:370:7334
说明
只应用规则 1,因为没有可以进行规则 2 压缩的连续相同数字组。
输入
1111:2222:2222:3333:4444:5555:6666:7777
输出
1111:**:3333:4444:5555:6666:7777
说明
连续相同数字组 2222:2222 长度最长,因此将其压缩为 **。
By signing up a CodeFun2000 universal account, you can submit code and join discussions in all online judging services provided by us.