题目链接:https://ac.nowcoder.com/acm/contest/886/B
题意:
您将获得一个IPv6地址,该地址是128位二进制字符串。请根据以下规则确定其最短的表示:
以十六进制表示形式表示地址,并使用冒号':'分割每四个十六进制数字。每四个数字称为一个字段。例如,'0000:0000:0123:4567:89ab:0000:0000:0000'
可以省略字段中的前导零。例如,上述IPv6地址可以缩短为 '0:0:123:4567:89ab:0:0:0'
由至少两个字段组成的连续零字段(靠近它们的冒号)可以用双冒号 '::' 替换。此外,地址中不能使用多个双冒号。
例如,上面的IPv6地址可以缩短为 '0:0:123:4567:89ab ::' 或 ':: 123:4567:89ab:0:0:0',但不能缩写为 ':: 123:4567: 89ab ::‘
如果有多个相同长度的最短格式,请使用字典序(将缩短的IPv6地址视为字符串)最小的一个
思路:
模拟处理字符串
个人感觉python比较好处理字符串,所以比赛的时候用python写的,python用的不多写得不好看,有python大佬的话就将就一下叭
先将二进制转为十六进制,并加入 “ : ”
然后将所有前导零去掉
寻找数目最多的相邻的 “ :0: ” ,将其变为 “ :: ”
注意:在可替换的 “ :0: ” 数目相同的情况下,换中间是比换最前和最后的优先级高的, 因为能多去掉一个冒号
(WA了无数发)
1 t=int(input()) 2 for i in range(t): 3 s=input() 4 l=len(s) 5 k=0; m=1; x=[]; y=['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'] 6 for j in range(l-1,-1,-1): 7 k+=int(s[j])*m; m=m*2 8 if j%4==0: 9 x.append(y[k]) 10 if j%16==0: 11 x.append(':') 12 k=0; m=1 13 x.reverse() 14 m=0; l=len(x) 15 for j in range(l): 16 if m==l: 17 break 18 if x[j]==':' and x[j+1]=='0': 19 del x[j+1] 20 j-=1; m+=1 21 m+=1 22 m=0; l=len(x) 23 for j in range(l): 24 if m==l: 25 break 26 if x[j]==':' and x[j+1]=='0': 27 del x[j+1] 28 j-=1; m+=1 29 m+=1 30 m=0; l=len(x) 31 for j in range(l): 32 if m==l: 33 break 34 if x[j]==':' and x[j+1]=='0': 35 del x[j+1] 36 j-=1; m+=1 37 m+=1 38 x.append(':') 39 l=len(x); r=1; sum=0; ans=0; p=0 40 for j in range(l): 41 if x[j]==':': 42 if j!=l-1 and r==0 and x[j+1]=='0': 43 sum+=1 44 else: 45 if sum>ans: 46 p=j-2*(sum+1); ans=sum; sum=0; r=1 47 if sum==ans and j!=l-1: 48 p=j-2*(sum+1); ans=sum; sum=0; r=1 49 if j==l-1 and sum>=ans: 50 if sum>ans or (sum==ans and p==0): 51 p=j-2*(sum+1); ans=sum; sum=0; r=1 52 if j!=l-1 and x[j+1]!='0': 53 r=1 54 else: 55 r=0 56 if ans!=0: 57 if p+ans*2+2==len(x)-1: 58 f=1 59 else: 60 f=0 61 for j in range(ans*2+2): 62 del x[p] 63 if f==1: 64 if p==0: 65 x.insert(p, ':') 66 else: 67 x.insert(p, ':') 68 del x[0] 69 if f==0: 70 if p==0: 71 x.insert(p, ':') 72 del x[len(x) - 1] 73 else: 74 x.insert(p, ':') 75 del x[0]; del x[len(x)-1] 76 else: 77 del x[0]; del x[len(x) - 1] 78 print("Case #"+str(i+1)+": "+"".join(x))
正因为是最弱,所以才理解智慧之强