[题解]Shorten IPv6 Address-模拟(2019牛客多校第六场B题)

题目链接: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))

猜你喜欢

转载自www.cnblogs.com/Yanick/p/11295552.html
今日推荐