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

【基础算法练习】Trie 树

文章目录

  • 模板题:[ACwing 835. Trie字符串统计](https://www.acwing.com/problem/content/description/837/)
    • 题目描述
    • 代码与解题思路
  • 模板题:[ACwing 143. 最大异或对](https://www.acwing.com/problem/content/145/)
    • 题目描述
    • 代码与解题思路
  • Trie 算法需要注意的点
    • Trie 树的构建和算法思想的理解:
    • Trie 树的算法模板

模板题:ACwing 835. Trie字符串统计

题目描述

代码与解题思路

#include <iostream>using namespace std;const int N = 100010;int son[N][26], cnt[N], idx;char str[N];void insert(char str[])
{   int p = 0; // 从第一个节点开始遍历for (int i = 0; str[i] != 0; i++) {int u = str[i] - 'a';// p 表示第几个节点, u 表示的是哪个字母// 如果 son 为 0 就新建节点, 如果 son 不为 0 就证明存在这个节点if (son[p][u] == 0) son[p][u] = ++idx;// 令 p 指向子节点(下一个节点)p = son[p][u];}// 以 p 这个节点为结尾的字符串数量 + 1cnt[p]++;
}int query(char str[])
{int p = 0;for (int i = 0; str[i] != 0; i++) {int u = str[i] - 'a';// 这个字符串不存在if (son[p][u] == 0) return 0;// 令 p 指向子节点p = son[p][u];}// 返回这个字符串存在的个数return cnt[p];
}int main()
{int n;cin >> n;while (n--) {char ch;cin >> ch >> str;if (ch == 'I') insert(str);else cout << query(str) << endl;}return 0;
}

模板题:ACwing 143. 最大异或对

题目描述

代码与解题思路

#include <isotream>
#include <algorithm>uisng namespace std;const int N = 100010, M = 3000000;int n;
int son[M][2], idx;
int a[N]void insert(int x) {int p  = 0; for (int i = 30; i >= 0; i--) {// 现在 s 是 son[p][x >> i & 1] 的引用, 写 s 就等于写 son[p][x >> i & 1]int& s = son[p][x >> i & 1]; // 新建节点if (s == 0) s = ++idx;// 令 p 指向子节点p = s;}
}int query(int x) {int res = 0, p = 0;for (int i = 30; i >= 0; i--) {int s = x >> i & 1;if (son[p][!s] != 0) { // 相异就累加res += 1 << i;p = son[p][!s];}else p = son[p][s]; // 相同就跳过}return res;
}int main()
{cin >> n;for (int i = 0; i < n; i++) {cin >> a[i];insert(a[i]); // 构建 Trie 树}int res = 0;for (int i = 0; i < n; i++) res = max(res, query(a[i]));cout << res << endl;return 0;
}

Trie 算法需要注意的点

Trie 树的构建和算法思想的理解:

Trie 树的算法模板

注释详解版本

const int N = 100010;int son[N][26], cnt[N], idx; // 节点数组、计数数组、数组容量下标char str[N]; // 字符串数组// 插入字符串
void insert(char str[]) {   int p = 0; // 从第一个节点开始遍历for (int i = 0; str[i] != 0; i++) {int u = str[i] - 'a';// p 表示第几个节点, u 表示的是哪个字母// 如果 son 为 0 就新建节点, 如果 son 不为 0 就证明存在这个节点if (son[p][u] == 0) son[p][u] = ++idx;// 令 p 指向子节点(下一个节点)p = son[p][u];}// 以 p 这个节点为结尾的字符串数量 + 1cnt[p]++;
}int query(char str[]) {int p = 0;for (int i = 0; str[i] != 0; i++) {int u = str[i] - 'a';// 这个字符串不存在if (son[p][u] == 0) return 0;// 令 p 指向子节点p = son[p][u];}// 返回这个字符串存在的个数return cnt[p];
}

无注释纯享版

int son[N][26], cnt[N], idx;
char str[N]; void insert(char str[]) {   int p = 0; for (int i = 0; str[i] != 0; i++) {int u = str[i] - 'a';if (son[p][u] == 0) son[p][u] = ++idx;p = son[p][u];}cnt[p]++;
}int query(char str[]) {int p = 0;for (int i = 0; str[i] != 0; i++) {int u = str[i] - 'a';if (son[p][u] == 0) return 0;p = son[p][u];}return cnt[p];
}

相关文章:

  • 【算法专题】贪心算法
  • git的分支操作
  • 特斯拉FSD的神经网络(Tesla 2022 AI Day)
  • 自然语言处理 TF-IDF
  • 有关UE5在VisualStudio升级后产生C++无法编译的问题及处理方案
  • 【Vue】为什么Vue3使用Proxy代替defineProperty?
  • Log4j2的PatternLayout详解
  • 如何使用Python+Flask搭建本地Web站点并结合内网穿透公网访问?
  • TypeScript实战系列之强力爆破泛型的困扰
  • vuex store,mutations,getters,actions
  • C++ 多线程编程中的条件变量std::condition_variable
  • 西瓜书学习笔记——层次聚类(公式推导+举例应用)
  • 在Ubuntu中修改系统时间并使其在掉电时保存
  • linux bash shell的getopt以及函数用法小记
  • 使用nginx对视频、音频、图片等静态资源网址,加token签权
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • angular组件开发
  • CentOS7简单部署NFS
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • exif信息对照
  • Facebook AccountKit 接入的坑点
  • Golang-长连接-状态推送
  • Kibana配置logstash,报表一体化
  • leetcode386. Lexicographical Numbers
  • SpingCloudBus整合RabbitMQ
  • Spring核心 Bean的高级装配
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Vue学习第二天
  • 模型微调
  • 目录与文件属性:编写ls
  • 移动端唤起键盘时取消position:fixed定位
  • 1.Ext JS 建立web开发工程
  • 阿里云服务器如何修改远程端口?
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • (day 12)JavaScript学习笔记(数组3)
  • (差分)胡桃爱原石
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (接口自动化)Python3操作MySQL数据库
  • (六)vue-router+UI组件库
  • (七)Knockout 创建自定义绑定
  • (三)Honghu Cloud云架构一定时调度平台
  • (循环依赖问题)学习spring的第九天
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .bat文件调用java类的main方法
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Net Core与存储过程(一)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET委托:一个关于C#的睡前故事
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • ::前边啥也没有
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @Pointcut 使用
  • @Resource和@Autowired的区别
  • @RestControllerAdvice异常统一处理类失效原因