#NCST202412F. 子网

子网

题目描述

winter_l 在经历了一次 XCPC 比赛后,突发奇想的将其中的一个网络题进行了修改,使其更加符合时代发展。

现在,给定一个 IPv6 的子网和若干个 IPv6 地址,请你帮 winter_l 判断每一个地址是否属于这个子网。如果属于,请输出 Yes 否则输出 No

IPv6 地址有以下规则:

  • IPv6128128 位地址每 1616 位划分为一段,总共 88 段,每段用冒号隔开,这种表示方法叫做“冒号十六进制表示法”,如: fe80:0000:0001:0000:0440:44ff:1233:5678

  • 有时候 IP 地址中有好多 00,就可以把两个冒号之间连续的一段 00 压缩为 :: ,即用冒号表示,但是一个IP地址中只能有一个 ::。 当存在多个连续的一段 00 时,压缩最长的一段,若长度相等则压缩最前面的一段。如: fe80:0000:0000:0000:0000:0000:0001:0000 \to fe80::0001:0000

  • 冒号之间的数字不满四位十六进制数时,可以省略前导零,如 fe80::0001:0000 \to fe80::1:0

简而言之就是,给你一个 IPv6 的网段,判断 nnIP 是不是它的子网。

输入格式

第一行,一个 CIDR 格式表示的 IPv6 子网。

第二行,一个整数 nn ,为需要判断的 IP 地址的个数。

接下来 nn 行,每一行是一个冒分十六进制表示的 IP 地址。

输出格式

nn 行,每行为 YesNo ,表示该地址是否属于给定的子网。

输入输出样例

::29F0:0:91BA:9DAF:A887:FAD6:0/64
8
::29F0:0:91BA:CE1F:343E:773D:204F
0:4DDA:0:F1B9:0:8856::
::29F0:0:91BA:3740:61F0:8183:2B55
0:D7D8:0:8754:A62D:CC68::
AC80:17BC:97EA::B0CC:0:0
D02B:0:2FFA::F60D:CA9C
0:8FC::7B0F:0:0:2953
::29F0:0:91BA:AF90:E8C4:46F2:8E4
Yes
No
Yes
No
No
No
No
Yes
::5119:CE57:731B:0:0:4368/96
4
::C4E7:768F:D0C2
::5119:CE57:731B:0:E3F:CF84
0:84B0:D291:0:4BB::96A9
F275::24A5:7128:99FD:3C19
No
Yes
No
No

提示

背景解析

IPv6 地址是一个 128128 位的二进制数,通常由八个十六位组成,每个十六位可以表示的最大数值是 FFFFFFFF (即二进制的 11111111111111111111111111111111 (161611))。冒分十六进制是表示 IP 地址的一种格式,它将地址的八个十六位组用冒号(:)分隔开来。每十六位组是一个介于 00FFFFFFFF 的十六进制数,因此称为冒分十六进制。

一个 IP 地址可以通过子网掩码分为网络号和主机号两部分,网络号相同的 IP 地址属于同一个子网。子网掩码是一个 128128 位的二进制数,由连续的若干个 11 紧跟着若干个 00 组成,其中的 11 表示网络位,00 表示主机位。例如: FFFF:FF00::(11111111111111111111111111111111 11111111000000001111111100000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000),表示前 2424 位为网络号,后 104104 位为主机号。

CIDR 表示法是一种简化和扩展 IP 地址表示的方法,它允许更灵活地定义和分配 IP 地址以及它们的子网。CIDR 表示法通过在 IP 地址后面附加一个斜线 / 和一个在 00128128 的数字来表示网络号的长度,这个数字表示子网掩码中连续的前缀 11 的位数。

数据规模

测试点 数据规模
1t31 \leq t \leq 3 1n1001 \leq n \leq 100
4t64 \leq t \leq 6 100<n500100 < n \leq 500
7t107 \leq t \leq 10 500<n1000500 < n \leq 1000
对于所有的数据 0网络号的长度1280 \leq 网络号的长度 \leq 128