在一个高度机密的跨国情报机构中,为了确保信息安全,所有特工都配备了一个唯一的 48 位二进制身份代号。该代号通常以 6 个十六进制字节的形式表示,例如 `00-d8-61-ef-31-3e`。 为了管理庞大的特工网络并精确控制访问权限,机构采用了一种基于前缀匹配的授权体系。一个授权规则由基础代号和安全等级 M 共同定义,格式为 `xx-xx-xx-xx-xx-xx/M`。 安全等级 M 是一个介于 0 到 48 之间的整数,它定义了身份代号中需要匹配的前 M 位。 - 当 M=48 时,要求身份代号完全匹配,这通常用于授权单个特工。 - 当 M < 48 时,只要求身份代号的前 M 位与基础代号的前 M 位相同,这通常用于授权一个小组或整个部门。例如,一条规则 `00-e0-fc-01-01-01/32` 意味着所有身份代号以 `00-e0-fc-01` 开头的特工都将被授予权限,其代号范围从 `00-e0-fc-01-00-00` 到 `00-e0-fc-01-ff-ff`。 - 特别地,当 M=0 时,不匹配任何位,意味着授权所有特工。 您的任务是开发一个高效的身份认证系统。给定一组授权规则,您需要快速判断前来访问的特工是否在授权列表中。
输入的第一行是一个整数 n ( 1 ≤ n ≤ 100000 ),代表授权规则的总数。 接下来的 n 行,每行包含一条授权规则,格式为 `xx-xx-xx-xx-xx-xx/M`,其中 M 是一个整数( 0 ≤ M ≤ 48 ),`xx` 是由小写字母 `a-f` 和数字 `0-9` 组成的两位十六进制数。 随后的一行是一个整数 m ( 1 ≤ m ≤ 100 ),代表待验证的特工数量。 接下来的 m 行,每行包含一个待验证的特工身份代号,格式为 `xx-xx-xx-xx-xx-xx`。
对于 m 个待验证的身份代号,逐行输出认证结果。如果一个代号至少匹配授权列表中的一条规则,则输出 `YES`;否则输出 `NO`。
10 7e-01-22-50-24-03/24 e0-6b-23-3f-23-15/10 58-7e-2a-50-e0-5f/19 bc-09-f7-b2-b3-92/46 e5-22-aa-f3-8c-8d/6 f1-62-a1-b1-90-d3/34 77-c3-f0-60-cd-d5/31 1a-2b-14-85-11-f2/48 a6-35-dc-ec-f8-fb/24 ab-3e-94-df-cb-e8/9 8 c2-94-58-13-76-28 e5-22-aa-f3-8c-8d 98-7a-23-6f-e6-de e0-6b-23-3f-23-15 77-c3-f0-60-cd-d5 b4-4a-ec-51-0a-fc 7e-01-22-50-24-03 e0-6b-23-3f-23-15
NO YES NO YES YES NO YES YES
考点:字典树
数据规模 n ≤ 1e5 | 限制 3 秒 / 256MB | 标准输入输出
推荐方向:字典树
本题切入点
前缀匹配是字典树的典型场景:把 M 位掩码拆成按位的路径,查询时沿特工代号的位序列走到最深处,沿途经过的任一规则叶子都算命中(M=0 为全匹配)。
把字符串集合建成多叉树,共享前缀,O(长度) 完成前缀查询。
思路框架(字典树 通法 · 非本题专属)
实现要点:字符集小时用定长数组,大时用 dict 存孩子。
复杂度:时间 O(总长度) | 空间 O(总长度 × 字符集)
该范式的通法易错点
对照本题
样例 1
10 / 7e-01-22-50-24-03/24 / e0-6b-23-3f-23-15/10 / 58-7e-2a-50-e0-5f/19 / bc-09-f7-b2-b3-92/46 / e5-22-aa-f3-8c-8d/6 / f1-62-a1-b1-90-d3/34 NO / YES / NO / YES / YES / NO / YES / YES解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。
本题来源:2025年秋招-华为-9月10号开发岗。