华为 · 字典树 · 算法编程题
华为 字典树 n ≤ 1e5 时限 3 秒 / 256 MB

题目描述

在一个高度机密的跨国情报机构中,为了确保信息安全,所有特工都配备了一个唯一的 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`。

样例共 1 组

样例 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
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 | 标准输入输出

题目画像

  • 数据规模:n ≤ 1e5,m ≤ 100,M ≤ 48
  • 复杂度门槛:只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 源站时限:3 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:字典树

本题切入点

前缀匹配是字典树的典型场景:把 M 位掩码拆成按位的路径,查询时沿特工代号的位序列走到最深处,沿途经过的任一规则叶子都算命中(M=0 为全匹配)。

把字符串集合建成多叉树,共享前缀,O(长度) 完成前缀查询。

思路框架(字典树 通法 · 非本题专属)

  1. 每个节点保存若干孩子指针 + 是否为单词结尾标记。
  2. 插入:逐字符向下走,不存在就新建节点。
  3. 查询:逐字符向下走,走不动就说明不存在该前缀。
  4. 字符串拆分类问题可配合 DP,用 Trie 加速「从 i 开始能匹配哪些词」。

实现要点:字符集小时用定长数组,大时用 dict 存孩子。

复杂度:时间 O(总长度) | 空间 O(总长度 × 字符集)

该范式的通法易错点

  • 忘记标记单词结尾,导致前缀被误判为单词。
  • 节点数组开太小导致越界。

对照本题

  • 数据规模 n ≤ 1e5,只允许 O(n log n) 及更优,朴素 O(n²) 会超时。

样例

样例 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号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解