import sys
def parse_ipv4(s: str):
parts = s.split('.')
if len(parts) != 4:
return None
nums = []
for p in parts:
if p == "" or not p.isdigit():
return None
v = int(p)
if v < 0 or v > 255:
return None
nums.append(v)
return nums
def mask_valid(mask_parts):
# mask_parts 已经是 4 个 0~255 的整数
bits = ''.join(f'{x:08b}' for x in mask_parts) # 32-bit string
if bits == '0' * 32 or bits == '1' * 32:
return False
# 必须是 若干个1 后跟 若干个0
k = bits.find('0') # 第一次出现0的位置
if k == -1: # 没有0(全1已排除),理论不会到这
return False
return (set(bits[:k]) == {'1'}) and (set(bits[k:]) == {'0'})
def is_private(ip):
a, b, c, d = ip
if a == 10:
return True
if a == 172 and 16 <= b <= 31:
return True
if a == 192 and b == 168:
return True
return False
def classify(ip):
a = ip[0]
if 1 <= a <= 127:
return 'A'
if 128 <= a <= 191:
return 'B'
if 192 <= a <= 223:
return 'C'
if 224 <= a <= 239:
return 'D'
if 240 <= a <= 255:
return 'E'
return None
def main():
A = B = C = D = E = ERR = PRI = 0
for line in sys.stdin:
line = line.strip()
if not line:
continue
if '~' not in line:
# 格式都不对,算错误(但题目一般不会给这种)
ERR += 1
continue
ip_s, mask_s = line.split('~', 1)
ip = parse_ipv4(ip_s)
# 跳过规则:只有在 IP 能解析出第一段时才能判断 0/127
if ip is not None and ip[0] in (0, 127):
continue
mask_parts = parse_ipv4(mask_s)
# 先判 IP/mask 格式合法
if ip is None or mask_parts is None:
ERR += 1
continue
# 再判掩码规则合法
if not mask_valid(mask_parts):
ERR += 1
continue
# 到这里:IP 和 MASK 都合法,开始分类
cls = classify(ip)
if cls == 'A':
A += 1
elif cls == 'B':
B += 1
elif cls == 'C':
C += 1
elif cls == 'D':
D += 1
elif cls == 'E':
E += 1
if is_private(ip):
PRI += 1
print(A, B, C, D, E, ERR, PRI)
if __name__ == "__main__":
main()