【基础算法练习】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];
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439972.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建 prometheus + grafana + springboot3 监控

下载安装包 下载prometheus&#xff1a;https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.windows-amd64.zip 下载grafana&#xff1a; https://dl.grafana.com/enterprise/release/grafana-enterprise-9.4.1.windows-amd64.zip Spr…

面向云服务的GaussDB全密态数据库

前言 全密态数据库&#xff0c;顾名思义与大家所理解的流数据库、图数据库一样&#xff0c;就是专门处理密文数据的数据库系统。数据以加密形态存储在数据库服务器中&#xff0c;数据库支持对密文数据的检索与计算&#xff0c;而与查询任务相关的词法解析、语法解析、执行计划生…

FL Studio21.2.2中文完整版 适合专业创作者

FL Studio 简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;因此国人习惯叫它"水果"。目前版本是FL Studio2024&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破想…

Mysql 更新数据

MySQL中使用UPDATE语句更新表中的记录&#xff0c;可以更新特定的行或者同时更新所有的行。基本语法结构如下&#xff1a; UPDATE table_name SET column_name1 value1,column_name2 value2,……, column_namen valuen WHERE(condition); column_name1,column_name2,……,…

npm login 错误 no credentials to set

如果你在使用如下npm命令时遇到了报错&#xff1a; npm login npm adduser报错如下&#xff1a; npm login err! no credentials to set. 如果你的报错信息正好类似&#xff0c;并且npm 版本大于9.0.0&#xff0c;那么只要重新安装低于9.0.0 版本的npm即可解决这问题 目前…

Django框架(三)编写第一个Django应用程序——第二部分

目录 编写第一个Django应用程序&#xff0c;第二部分 数据库设置 创建模型&#xff08;Model&#xff09; 激活模型 使用API Django Admin 简介 创建管理员用户 启动开发服务器 进入管理站点 将投票应用程序加入管理站点 探索管理功能 编写第一个Django应用程序&…

elk之简介

写在前面 本文看下es的简介。 1&#xff1a;简介 背后公司&#xff0c;elastic&#xff0c;08年纽交所上市&#xff0c;与腾讯&#xff0c;阿里等云厂商有合作&#xff0c;推出云产品&#xff0c;类似功能的产品由solr&#xff0c;splunk&#xff0c;但使用量es当前遥遥领先…

【Java反序列化】Shiro-550漏洞分析笔记

目录 前言 一、漏洞原理 二、Shiro环境搭建 三、Shiro-550漏洞分析 解密分析 加密分析 四、URLDNS 链 前言 shiro-550反序列化漏洞大约在2016年就被披露了&#xff0c;在上学时期也分析过&#xff0c;最近在学CC链时有用到这个漏洞&#xff0c;重新分析下并做个笔记&…

负载均衡技术助力企业数字化转型和高可用架构实现

文章目录 什么是高可用架构什么是负载均衡负载均衡设备硬件负载均衡的代表产品软件负载均衡的代表产品 负载均衡基于OSI模型分层负载均衡在网络层负载均衡在传输层负载均衡在应用层 优先考虑负载均衡的场景硬件负载均衡的缺点云负载均衡正在成为最佳选择企业数字化转型对负载均…

[PHP]严格类型

PHP: 类型声明 - Manual

大模型学习与实践笔记(十四)

使用 OpenCompass 评测 InternLM2-Chat-7B 模型使用 LMDeploy 0.2.0 部署后在 C-Eval 数据集上的性能 步骤1&#xff1a;下载internLM2-Chat-7B 模型,并进行挂载 以下命令将internlm2-7b模型挂载到当前目录下&#xff1a; ln -s /share/model_repos/internlm2-7b/ ./ 步骤2&…

数据结构----链表介绍、模拟实现链表、链表的使用

文章目录 1. ArrayList存在的问题2. 链表定义2.1 链表的概念及结构2.2 链表的组合类型 3. 链表的实现3.1 单向、不带头、非循环链表的实现3.2 双向、不带头节点、非循环链表的实现 4.LinkedList的使用4.1 什么是LinkedList4.2 LinkedList的使用4.2.1. LinkedList的构造4.2.2. L…