CF1070B.Berkomnadzor
提高+/省选-
通过率:0%
时间限制:3.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Berkomnadzor — Federal Service for Supervision of Communications, Information Technology and Mass Media — is a Berland federal executive body that protects ordinary residents of Berland from the threats of modern internet.
Berkomnadzor maintains a list of prohibited IPv4 subnets (blacklist) and a list of allowed IPv4 subnets (whitelist). All Internet Service Providers (ISPs) in Berland must configure the network equipment to block access to all IPv4 addresses matching the blacklist. Also ISPs must provide access (that is, do not block) to all IPv4 addresses matching the whitelist. If an IPv4 address does not match either of those lists, it's up to the ISP to decide whether to block it or not. An IPv4 address matches the blacklist (whitelist) if and only if it matches some subnet from the blacklist (whitelist). An IPv4 address can belong to a whitelist and to a blacklist at the same time, this situation leads to a contradiction (see no solution case in the output description).
An IPv4 address is a 32-bit unsigned integer written in the form a.b.c.d, where each of the values a,b,c,d is called an octet and is an integer from 0 to 255 written in decimal notation. For example, IPv4 address 192.168.0.1 can be converted to a 32-bit number using the following expression 192⋅224+168⋅216+0⋅28+1⋅20. First octet a encodes the most significant (leftmost) 8 bits, the octets b and c — the following blocks of 8 bits (in this order), and the octet d encodes the least significant (rightmost) 8 bits.
The IPv4 network in Berland is slightly different from the rest of the world. There are no reserved or internal addresses in Berland and use all 232 possible values.
An IPv4 subnet is represented either as a.b.c.d or as a.b.c.d/x (where 0≤x≤32). A subnet a.b.c.d contains a single address a.b.c.d. A subnet a.b.c.d/x contains all IPv4 addresses with x leftmost (most significant) bits equal to x leftmost bits of the address a.b.c.d. It is required that 32−x rightmost (least significant) bits of subnet a.b.c.d/x are zeroes.
Naturally it happens that all addresses matching subnet a.b.c.d/x form a continuous range. The range starts with address a.b.c.d (its rightmost 32−x bits are zeroes). The range ends with address which x leftmost bits equal to x leftmost bits of address a.b.c.d, and its 32−x rightmost bits are all ones. Subnet contains exactly 232−x addresses. Subnet a.b.c.d/32 contains exactly one address and can also be represented by just a.b.c.d.
For example subnet 192.168.0.0/24 contains range of 256 addresses. 192.168.0.0 is the first address of the range, and 192.168.0.255 is the last one.
Berkomnadzor's engineers have devised a plan to improve performance of Berland's global network. Instead of maintaining both whitelist and blacklist they want to build only a single optimised blacklist containing minimal number of subnets. The idea is to block all IPv4 addresses matching the optimised blacklist and allow all the rest addresses. Of course, IPv4 addresses from the old blacklist must remain blocked and all IPv4 addresses from the old whitelist must still be allowed. Those IPv4 addresses which matched neither the old blacklist nor the old whitelist may be either blocked or allowed regardless of their accessibility before.
Please write a program which takes blacklist and whitelist as input and produces optimised blacklist. The optimised blacklist must contain the minimal possible number of subnets and satisfy all IPv4 addresses accessibility requirements mentioned above.
IPv4 subnets in the source lists may intersect arbitrarily. Please output a single number -1 if some IPv4 address matches both source whitelist and blacklist.
Berkomnadzor(俄罗斯联邦通信、信息技术和大众传媒监督局)是贝尔兰联邦执行机构,负责保护贝尔兰普通居民免受现代互联网威胁。
Berkomnadzor 维护一个被禁止的 IPv4 子网列表(黑名单)和一个被允许的 IPv4 子网列表(白名单)。贝尔兰所有互联网服务提供商(ISP)必须配置网络设备,以阻止访问所有匹配黑名单的 IPv4 地址;同时,ISP 必须确保提供对所有匹配白名单的 IPv4 地址的访问(即不得阻止)。若某个 IPv4 地址既不匹配黑名单也不匹配白名单,则由 ISP 自行决定是否阻止该地址。一个 IPv4 地址当且仅当它匹配黑名单(白名单)中的至少一个子网时,才被视为匹配该黑名单(白名单)。一个 IPv4 地址可能同时属于白名单与黑名单,此时将导致矛盾(参见输出说明中的“无解情况”)。
IPv4 地址是一个 32 位无符号整数,写作 a.b.c.d 形式,其中每个值 a,b,c,d 称为一个“八位组(octet)”,均为十进制表示的 0 至 255 的整数。例如,IPv4 地址 192.168.0.1 可通过如下表达式转换为 32 位整数:192⋅224+168⋅216+0⋅28+1⋅20。第一个八位组 a 编码最高有效(最左侧)的 8 位,八位组 b 和 c 分别编码接下来的两个 8 位块(按此顺序),而八位组 d 编码最低有效(最右侧)的 8 位。
贝尔兰的 IPv4 网络与世界其他地区略有不同:贝尔兰不存在保留地址或内网地址,全部 232 个可能取值均被使用。
IPv4 子网以 a.b.c.d 或 a.b.c.d/x(其中 0≤x≤32)的形式表示。子网 a.b.c.d 仅包含单个地址 a.b.c.d;子网 a.b.c.d/x 包含所有 IPv4 地址中最左侧(最高有效)的 x 位与地址 a.b.c.d 的最左侧 x 位完全相同的地址。要求子网 a.b.c.d/x 的最右侧(最低有效)32−x 位必须全为零。
自然地,所有匹配子网 a.b.c.d/x 的地址构成一个连续的地址范围。该范围起始于地址 a.b.c.d(其最右侧 32−x 位为零),终止于这样一个地址:其最左侧 x 位与 a.b.c.d 的最左侧 x 位相同,且其最右侧 32−x 位全为一。该子网恰好包含 232−x 个地址。子网 a.b.c.d/32 恰好包含一个地址,亦可简写为 a.b.c.d。
例如,子网 192.168.0.0/24 包含 256 个地址:起始地址为 192.168.0.0,结束地址为 192.168.0.255。
Berkomnadzor 的工程师提出了一项提升贝尔兰全球网络性能的方案:不再分别维护黑白名单,而是仅构建一个优化后的单一黑名单,使其所含子网数量最少。其思路是:仅阻止优化黑名单中涵盖的所有 IPv4 地址,其余所有地址均允许访问。当然,原黑名单中的所有 IPv4 地址必须继续保持被阻止状态,而原白名单中的所有 IPv4 地址也必须继续保持可访问状态。对于原先既不匹配黑名单也不匹配白名单的 IPv4 地址,无论其先前是否可访问,现在均可任选阻止或允许。
请编写一个程序,以原始黑名单和白名单为输入,生成满足上述要求的优化黑名单。该优化黑名单必须包含最少数量的子网,并满足前述所有 IPv4 地址可访问性约束。
原始列表中的 IPv4 子网可以任意相交。若存在某个 IPv4 地址同时匹配原始白名单与原始黑名单,请直接输出单个数字 -1。
输入格式
The first line of the input contains single integer n (1≤n≤2⋅105) — total number of IPv4 subnets in the input.
The following n lines contain IPv4 subnets. Each line starts with either '-' or '+' sign, which indicates if the subnet belongs to the blacklist or to the whitelist correspondingly. It is followed, without any spaces, by the IPv4 subnet in a.b.c.d or a.b.c.d/x format (0≤x≤32). The blacklist always contains at least one subnet.
All of the IPv4 subnets given in the input are valid. Integer numbers do not start with extra leading zeroes. The provided IPv4 subnets can intersect arbitrarily.
输入的第一行包含一个整数 n(1≤n≤2⋅105),表示输入中 IPv4 子网的总数。
接下来的 n 行包含 IPv4 子网。每行以字符 '-' 或 '+' 开头,分别表示该子网属于黑名单或白名单。其后无任何空格地跟随着一个 IPv4 子网,格式为 a.b.c.d 或 a.b.c.d/x(其中 0≤x≤32)。黑名单中至少包含一个子网。
输入中给出的所有 IPv4 子网均合法。整数不包含前导零。所给的 IPv4 子网之间可以任意相交。
输出格式
Output -1, if there is an IPv4 address that matches both the whitelist and the blacklist. Otherwise output t — the length of the optimised blacklist, followed by t subnets, with each subnet on a new line. Subnets may be printed in arbitrary order. All addresses matching the source blacklist must match the optimised blacklist. All addresses matching the source whitelist must not match the optimised blacklist. You can print a subnet a.b.c.d/32 in any of two ways: as a.b.c.d/32 or as a.b.c.d.
If there is more than one solution, output any.
如果存在一个同时匹配白名单和黑名单的 IPv4 地址,则输出 −1。否则,输出 t —— 优化后黑名单的长度,随后输出 t 个子网,每个子网占一行。子网的输出顺序可以任意。所有匹配原始黑名单的地址也必须匹配优化后的黑名单;所有匹配原始白名单的地址则不得匹配优化后的黑名单。子网 a.b.c.d/32 可以任选以下两种方式之一输出:a.b.c.d/32 或 a.b.c.d。
若存在多个解,输出任意一个即可。
输入输出样例
输入#1
1 -149.154.167.99
输出#1
1 0.0.0.0/0
输入#2
4 -149.154.167.99 +149.154.167.100/30 +149.154.167.128/25 -149.154.167.120/29
输出#2
2 149.154.167.99 149.154.167.120/29
输入#3
5 -127.0.0.4/31 +127.0.0.8 +127.0.0.0/30 -195.82.146.208/29 -127.0.0.6/31
输出#3
2 195.0.0.0/8 127.0.0.4/30
输入#4
2 +127.0.0.1/32 -127.0.0.1
输出#4
-1
输入解题思路,AI测评打分。不知道怎么写?