import sys
def is_valid_ip(ip_parts):
"""检查IP地址是否合法"""
if len(ip_parts) != 4:
return False
for part in ip_parts:
if not part.isdigit():
return False
num = int(part)
if num < 0 or num > 255:
return False
return True
def is_valid_mask(mask_parts):
"""检查子网掩码是否合法"""
if not is_valid_ip(mask_parts):
return False
# 转换为32位二进制字符串
binary_str = ""
for part in mask_parts:
binary_str += bin(int(part))[2:].zfill(8)
# 检查是否由连续的1后跟连续的0组成
# 找到第一个0出现的位置
first_zero = binary_str.find("0")
# 找到最后一个1出现的位置
last_one = binary_str.rfind("1")
# 如果没有0或者没有1,都不合法
if first_zero == -1 or last_one == -1:
return False
# 检查1和0的连续性:最后一个1应该在第一个0之前
# 并且从第一个0开始后面应该全是0
if last_one > first_zero:
return False
# 检查第一个0后面是否全是0
if "1" in binary_str[first_zero:]:
return False
return True
def main():
a = b = c = d = e = error = private = 0
for line in sys.stdin:
line = line.strip()
if not line:
continue
if "~" not in line:
error += 1
continue
ip_str, mask_str = line.split("~", 1)
ip_parts = ip_str.split(".")
mask_parts = mask_str.split(".")
# 先检查IP格式
if not is_valid_ip(ip_parts):
error += 1
continue
first_octet = int(ip_parts[0])
# 跳过0.*.*.*和127.*.*.*
if first_octet == 0 or first_octet == 127:
continue
# 再检查掩码格式
if not is_valid_mask(mask_parts):
error += 1
continue
# 分类统计
if 1 <= first_octet <= 126:
a += 1
elif 128 <= first_octet <= 191:
b += 1
elif 192 <= first_octet <= 223:
c += 1
elif 224 <= first_octet <= 239:
d += 1
elif 240 <= first_octet <= 255:
e += 1
# 私有IP统计
if first_octet == 10:
private += 1
elif first_octet == 172:
second_octet = int(ip_parts[1])
if 16 <= second_octet <= 31:
private += 1
elif first_octet == 192:
second_octet = int(ip_parts[1])
if second_octet == 168:
private += 1
print(f"{a} {b} {c} {d} {e} {error} {private}")
if __name__ == "__main__":
main()