44 lines
1.2 KiB
Python
44 lines
1.2 KiB
Python
from heapq import heapify, heappush, heappop
|
|
from .util import mask, get_data, cidr4_to_node, make_cidr4
|
|
|
|
|
|
def solution(cidrs, M):
|
|
h = []
|
|
d = {}
|
|
for ip, l in cidrs:
|
|
h.append((32-l, ip, l))
|
|
d[(ip, l)] = 0
|
|
heapify(h)
|
|
while len(h)>M:
|
|
x1, ip1, l1 = heappop(h)
|
|
x2, ip2, l2 = h[0]
|
|
if l1==l2 and ip1 & mask[l1-1] == ip2 & mask[l2-1]:
|
|
heappop(h)
|
|
if (ip1 & mask[l1-1], l1-1) not in d:
|
|
heappush(h, (x1+1, ip1 & mask[l1-1], l1-1))
|
|
d[(ip1 & mask[l1-1], l1-1)] = d[(ip1, l1)] + d[(ip2, l2)]
|
|
del d[(ip2, l2)]
|
|
else:
|
|
if (ip1 & mask[l1-1], l1-1) not in d:
|
|
heappush(h, (x1+1, ip1 & mask[l1-1], l1-1))
|
|
d[(ip1 & mask[l1-1], l1-1)] = d[(ip1, l1)] + 2**x1
|
|
del d[(ip1, l1)]
|
|
s = sum(d.values())
|
|
cidrs = list(d.keys())
|
|
return cidrs, s
|
|
|
|
|
|
def main():
|
|
M = 20
|
|
a = get_data()
|
|
b = list(map(cidr4_to_node, a))
|
|
cidrs, s = solution(b, M)
|
|
cidrs = sorted([make_cidr4(*x) for x in cidrs])
|
|
print(cidrs, s, sep='\n')
|
|
|
|
|
|
if __name__=='__main__':
|
|
import cProfile
|
|
main()
|
|
|