当前位置: 首页 > news >正文

字典树 Trie 乱讲

Trie 是什么

实际上它就是一颗像字典的树,支持插入单词和查询单词个数等操作。

它的边权是某个字符。

比如上图,插入单词 aca 时,我们就可以在 \(5\) 号节点下新建一个节点,边权为 a。而查询是否单词 abs 时,答案为是,因为存在路径 \(1 \to 2 \to 3 \to 4\) 的边权为 abs。

Trie 的实现

插入 & 删除

插入:对于已有的位置,我们直接就可以在原有基础上加;否则就新建一个节点。

删除同理。

// cnt[u]:1 -> u 这条路径以前有几次走过(记录路径对应单词个数)
// trie[u][x]:节点 u 的孩子中,对应边权为 x 的节点编号
void insert(string s){int u = 0;for(int i = 0; i < s.size(); i++){if(!trie[u][s[i] - 'a' + 1]){ // 没有下一个对应节点,新建一个c++;trie[u][s[i] - 'a' + 1] = c;}u = trie[u][s[i] - 'a' + 1]; // 到下一个对应节点cnt[u]++; // 将当前节点的权值 + 1}
}
void del(string s){int u = 0;for(int i = 0; i < s.size(); i++){u = trie[u][s[i] - 'a' + 1]; // 到下一个对应节点cnt[u]--; // 将当前节点的权值 - 1}
}

查询个数

这个过程很像插入,但是如果没有下一个对应节点就说明这个单词不存在,直接返回 \(0\);否则答案为最后一个节点的权值。

void insert(string s){int u = 0;for(int i = 0; i < s.size(); i++){if(!trie[u][s[i] - 'a' + 1]) return 0; // 没有下一个对应节点,也就没有对应单词u = trie[u][s[i] - 'a' + 1]; // 到下一个对应节点}return cnt[u];
}

Trie 的应用

在一些需要求解相同前 / 后缀个数、查找一个字符串是否出现过 / 出现次数时可以用到,但是很少会单独用它。

AC 自动机要用,但我不会。

变式:01 Trie

这个东西就相对常用了。顾名思义,01Trie 就是只维护 \(0\)\(1\) 的 Trie。

看到 \(0\)\(1\),很自然地会想到二进制。我们可以以 01Trie 维护最小 / 大异或值一类问题。

实现大体是一样的,直接贴代码吧。

void insert(ll s){ll u = 0;for(int i = 29; i >= 0; i--){bool x = (s >> i) & 1;if(!zotrie[u][x]){c++;zotrie[u][x] = c;}u = zotrie[u][x];cnt[u]++;}
}
void del(ll s){ll u = 0;for(int i = 29; i >= 0; i--){bool x = (s >> i) & 1;u = zotrie[u][x];cnt[u]--;}
}
ll querymax(ll s){ll ans = 0, u = 0;for(int i = 29; i >= 0; i--){bool x = (s >> i) & 1;ans <<= 1;if(cnt[zotrie[u][!x]]){ // 取反是因为异或最大当然要优先不同位位数最高ans++;u = zotrie[u][!x];}else u = zotrie[u][x];}return ans;
}
ll querymin(ll s){ll ans = 0, u = 0;for(int i = 29; i >= 0; i--){bool x = (s >> i) & 1;ans <<= 1;if(cnt[zotrie[u][x]]){ // 不取反同理u = zotrie[u][x];}else{ans++;u = zotrie[u][!x];}}return ans;
}
http://www.gsyq.cn/news/23181.html

相关文章:

  • 申威(sw_64)架构下如何安装java-1.8.0-swjdk的rpm包?​
  • 实用指南:计算机毕设java基于mybatis的医用器械管理系统 基于 SSM+JavaWeb 的医用器械全流程管理平台 Java+MySQL 的医疗物资一体化系统
  • ffmpeg使用
  • 2025.10.17总结 - A
  • Ubuntu创建python桌面图标
  • Nimble:让SwiftObjective-C测试变得更优雅的匹配库 - 指南
  • 【Linux】基础 I/O - 指南
  • DIVCNT
  • 详细介绍:CI/CD流水线优化:GitLab CI镜像构建加速实战​
  • 最新版Origin 2025b安装包下载及详细安装教程,附永久免费中文汉化破解版Origin安装包
  • Unity3D中定义全局宏(不同于在unity设置中的)
  • HyperWorks许可状态监控工具
  • 从创作到分析:2025 公众号排版工具全维度测评榜单
  • 2025 年无锡专线物流公司最新推荐排行榜:聚焦个性化运输解决方案,精选优质服务商往返无锡/冷链无锡/公路无锡/大件无锡专线物流公司推荐
  • 第三次课动手动脑合集
  • 2025 年火山石厂家最新推荐排行榜:聚焦自有矿藏与全自动生产,涵盖滤料填料等多品类企业权威指南人工湿地填料/人工湿地滤料/黑色/红色火山石厂家推荐
  • mysql5.7.44升级到8.0.34 mysql跨版本升级实战操作 windows环境
  • 【SPIE出版、往届已检索】第十届能源系统、电气与电力国际学术会议 (ESEP 2025)
  • 2025-10-17
  • 有趣评测小程序系统:开启视频与答题变现新创业风口
  • 设备租赁归还小程序系统:免人工化租赁管理解决方案
  • Navcat如何上传数据大的sql文件?
  • 使用Scalar.AspNetCore来管理你的OpenApi
  • 设计社会意识算法的三大关键问题
  • 【转】[C#] 项目里的配置文件与选项对比
  • 深入解析米尔全志T536核心板的实时性技术突破
  • 2025年西安买房终极指南:十大热门楼盘排名揭秘
  • Nessus Professional 10.10 Auto Installer for RHEL 10, AlmaLinux 10, Rocky Linux 10
  • VMware Workstation Fusion 25H2:采用日历版本命名与全新功能
  • 常见英语翻译汉语