• [题解]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))
    正因为是最弱,所以才理解智慧之强
  • 相关阅读:
    Raphael入门
    EXT使用SASS修改主题样式问题
    Hough Transform Performance article List
    about utf8 ...
    computer vision resource
    Asp.net 中配置 CKEditor和CKFinder
    压缩格式 zip与tar.gz 区别
    一系列按钮的弹出提示框借助jq实现
    SQL Server2005 sa登录出错~
    正则表达式整理
  • 原文地址:https://www.cnblogs.com/Yanick/p/11295552.html
Copyright © 2020-2023  润新知