CCF 201812-3 CIDR合并(Python100分)

CCF历届真题 部分题解 ,点击进入

问题描述

试题编号:201812-3
试题名称:CIDR合并
时间限制:1.0s
内存限制:512.0MB
问题描述:

 

样例输入

    2
    1
    2

样例输出

    1.0.0.0/8
    2.0.0.0/8

样例输入

    2
    10/9
    10.128/9

样例输出

    10.0.0.0/8

样例输入

    2
    0/1
    128/1

样例输出

    0.0.0.0/0

 

def combine1(a,b):
    if a[0]*16777216+a[1]*65536+a[2]*256+a[3]>>(32-a[4]) ==b[0]*16777216+b[1]*65536+b[2]*256+b[3]>>(32-a[4]):
        return True
    else:
        return False
 
def combine2(a,b):
    if a[0]*16777216+a[1]*65536+a[2]*256+a[3]>>(32-a[4]+1) ==b[0]*16777216+b[1]*65536+b[2]*256+b[3]>>(32-a[4]+1) and a[4]==b[4]:
        return True
    else:
        return False

n=int(input())
nums=[]
for i in range(n):
    s=input()
    num=[]
    ip=0
    prefix_len=0
    if '.' in s:
        while '.' in s:
            index=s.index('.')
            num.append(int(s[:index]))
            s=s[index+1:]
    if '/' in s:
        index=s.index('/')
        prefix_len=int(s[index+1:])
        num.append(int(s[:index]))
        num+=(4-len(num))*[0]
        num.append(prefix_len)
    else:
        num.append(int(s))
        prefix_len=len(num)*8
        num+=(4-len(num))*[0]
        num.append(prefix_len)
    #num=[1,2,3,4,prefix_len]
    nums.append(num)
#1.排序
nums.sort()
#2.从小到大合并
list2=[]
flag=nums[0]
list2.append(flag)
for i in nums[1:]:
    if not combine1(flag,i):
        list2.append(i)
        flag=i
#3.同级合并
list3=[0]*len(list2)
top=0
for i in list2:
    list3[top]=i
    top+=1
    while top>=2:
        if combine2(list3[top-2],list3[top-1]):
            x=list3[top-2]
            x[4]-=1
            top-=1
            list3[top]=x
            #top-=2
            #list3[top]=x
            #top+=1
        else:
            break
for i in range(top):
    print('.'.join(map(str,list3[i][:4]))+'/'+str(list3[i][4]))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值