当前位置: 代码迷 >> 综合 >> python实现 CCF201812-3 CIDR合并
  详细解决方案

python实现 CCF201812-3 CIDR合并

热度:13   发布时间:2023-10-23 04:34:10.0

 

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

python实现 CCF201812-3 CIDR合并
python实现 CCF201812-3 CIDR合并
python实现 CCF201812-3 CIDR合并

样例输入

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
python实现 CCF201812-3 CIDR合并

python实现 CCF201812-3 CIDR合并

 60分代码(只进行排序即可)

from copy import deepcopyn = int(input())
value = [1]                             # 通过ip前缀求匹配集
temp = 1                                # 如101.5.5/24,匹配集最大为:101.5.5.255
for i in range(1, 32):                  # value[5] = 255temp = temp + 2 ** ivalue.append(temp)# 将ip地址转化为标准型
ip_list = []
for i in range(n):temp = input()point_num = temp.count('.')if point_num == 3 and '/' in temp:   # 标准型temp = tempelif '/' not in temp:                # 省略长度型if point_num == 0:temp = temp + ".0.0.0/8"elif point_num == 1:temp = temp + ".0.0/16"elif point_num == 2:temp = temp + '.0/24'else:temp = temp + '/32'else:                                # 省略后缀型temp = temp.split('/')if point_num == 0:temp = temp[0] + ".0.0.0/" + temp[1]elif point_num == 1:temp = temp[0] + '.0.0/' + temp[1]elif point_num == 2:temp = temp[0] + '.0/' + temp[1]ip = deepcopy(temp)temp = temp.split('/')temp[0] = temp[0].split('.')ans = 0                              # 将ip地址转化为十进制形式for j in range(4):a = int(temp[0][j])ans += a * (256 ** (3-j))end = 32 - int(temp[1])ip_list.append([ans, int(temp[1]), ip, value[end-1]])# ip前缀的匹配集范围为:[ans, ans + value[end-1]]##print(value)
##print(ip_list)
# 第一步:排序
sort = sorted(ip_list, key=lambda x: (x[0], x[1])) # 只进行排序就有60分
for s in sort:print(s[2])