样例输入
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
分析:
按照题目给定的算法求解即可。
1.定义一个类型表示IP前缀:
1 | typedef struct Node { |
2.在第二步:从小到大合并中,如何判断b的匹配集是否为a的匹配集的子集?
根据匹配的定义可知,前缀长度越大,该IP前缀匹配的IP地址越少。
因此,若a的前缀长度大于b的前缀长度,则b的匹配集不可能是a的匹配集的子集。
如果a.len <= b.len
,则判断它们IP地址的前a.len位是否相同。若有一位不同,则b的匹配集不是a的匹配集的子集。
1 | // 判断b是否为a的子集 |
3.在第三步:同级合并中,如何判断$a^{’}$是否合法,以及a的匹配集与b的匹配集的并集是否等于$a^{’}$的匹配集?
(1)判断$a^{’}$是否合法:根据IP前缀的定义,前缀长度 $len \in [0,32]$,且ip的低(32-len)二进制位为0。
(2)判断a的匹配集与b的匹配集的并集是否等于$a^{’}$的匹配集:
若a和b的ip地址前a.len-1
位均相同,且a.len位不相同,则a的匹配集与b的匹配集的并集等于$a^{’}$的匹配集。
1 | // 判断是否能进行同级合并 |
- C++版
1 |
|