字典树学习笔记

news2024/10/6 12:26:48

trie 树,即字典树,是一种可以实现 O ( S ) O(S) O(S) 的预处理( S S S 为所有字符串的长度和), O ( N ) O(N) O(N) N N N 为查询的字符串的长度)的查询的数据结构。

举个栗子,对于字符串: abcd \texttt{abcd} abcd abd \texttt{abd} abd bcd \texttt{bcd} bcd efg \texttt{efg} efg,它的 trie 树如下:

那么,trie 树的建立、查询操作怎么代码实现呢?在此奉上蒟蒻的代码:

  • 建立

    int trie[maxn][30],cnt[maxn],tot;
    //trie[N][r]用来存储Trie树中的子节点(节点编号为N,它的字符儿子编号为r,比如trie[2][3]存储的就是节点编号为2,它的一个儿子为'd')
    //cnt[N]存储的是以当前结尾的字符串有多少个,tot存储当前共有几个节点
    //下标是0的点,既是根节点,又是空节点
    char str[N];
    void insert(char *str)
    {
        int p=0;//根节点为0
        for(int i=0;str[i];i++)
        {
            int u=str[i]-'a';//当前字母子节点
            if(!trie[p][u]) trie[p][u]=++tot;//如果当前子节点不存在就创造一个点来存储子节点
            p=trie[p][u];//让p走到子节点的位置
            cnt[p]++;//结尾是p的字符串个数增加
        }
    }
    
  • 查询

    int query(char *str)
    {
        int p=0;
        for(int i=0;str[i];i++)
        {
            int u=str[i]-'a';//当前字母子节点的编号
            if(!trie[p][u]) return 0;//如果当前字符不存在那么直接返回0
            p=trie[p][u];//让p走到子节点的位置
        }
        return cnt[p];//最后返回以p结尾的字符串个数
    }
    

练手板子题

代码如下:

#include <bits/stdc++.h>
using namespace std;

const int maxn=2e6+5;
int t[maxn][65],cnt[maxn],tot;
char s[maxn];

int getn(char x)
{
 if(x<='Z'&&x>='A') return x-'A';
 else if(x<='z'&&x>='a') return x-'a'+26;
 else return x-'0'+52;
}

void insert(char s[])
{
 int p=0,len=strlen(s);//根节点为0
 for(int i=0;i<len;i++)
 {
     int u=getn(s[i]);//当前字母子节点
     if(!t[p][u]) t[p][u]=++tot;//如果当前子节点不存在就创造一个点来存储子节点
     p=t[p][u];//让p走到子节点的位置
     cnt[p]++;//结尾是p的字符串个数增加
 }
}

int ask(char s[])
{
 int p=0,len=strlen(s);
 for(int i=0;i<len;i++)
 {
     int u=getn(s[i]);
     if(!t[p][u]) return 0;
     p=t[p][u];
 }
 return cnt[p];
}

int main()
{
 int T;cin>>T;
 while(T--)
 {
     for(int i=0;i<tot;i++)
         for(int j=0;j<65;j++) t[i][j]=0;
     for(int i=0;i<tot;i++) cnt[i]=0;
     tot=0;
     int n,q;cin>>n>>q;
     for(int i=1;i<=n;i++)
         cin>>s,insert(s);
     for(int i=1;i<=q;i++)
         cin>>s,cout<<ask(s)<<endl;
 }
 return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust-后端服务调试入坑记

这篇文章收录于Rust 实战专栏。这个专栏中的相关代码来自于我开发的笔记系统。它启动于是2023年的9月14日。相关技术栈目前包括&#xff1a;Rust&#xff0c;Javascript。关注我&#xff0c;我会通过这个项目的开发给大家带来相关实战技术的分享。 如果你关注过我的Rust 实战里…

Baize_h1mini六足机器人零件准备

导航在这里&#xff1a; Baize_H1mini六足机器人制作教程&#xff08;开源&#xff09;_ros 六足机器人教程-CSDN博客 你现在在地图的红色字体位置&#xff08;走到终点就制作完成了&#xff09;&#xff1a; 重要提示&#xff1a;自己使用打印机打印零件时&#xff0c;对于新…

Pandas数据处理分析系列5-数据如何提取

Pandas-数据提取 ①通过索引提取数据 # 提取前10行数据 df.head(10) # 提取末尾10行数据 df.tail(10) # 通过列名提取数据 df[列名’] # 通过布尔条件提取数据 df[df[列名] > 10] # 多条件过滤 df[(df[列名1] > 10) & (df[列名2] < 20)] df1=pd.read_excel(&quo…

14.Tensor Product:Covector-Covector Pairs

该文张量积仍使用一些非标准的符号。 左边的将是本文使用的 &#xff0c; 右边的是标准。 Covector-Covector Pairs 是Bilinear Forms 在上一节中&#xff0c; Linear Maps linear combinations of vector-covector pairs 这种将向量和协向量组合在一起的过程叫 张量积 这…

基于springboot实现java学习平台项目【项目源码+论文说明】计算机毕业设计

基于springboot实现java学习平台演示 摘要 在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括学习平台的网络应用&#xff0c;在外国学习平台已经是很普遍的方式&#xff0c;不过国内的管理平台可能还处于起步阶段。学习平台具…

Leetcode 第 360 场周赛题解

Leetcode 第 360 场周赛题解 Leetcode 第 360 场周赛题解题目1&#xff1a;2833. 距离原点最远的点思路代码复杂度分析 题目2&#xff1a;2834. 找出美丽数组的最小和思路代码复杂度分析 题目3&#xff1a;2835. 使子序列的和等于目标的最少操作次数思路代码复杂度分析 题目4&a…

使用GoogleNet网络实现花朵分类

一.数据集准备 新建一个项目文件夹GoogleNet&#xff0c;并在里面建立data_set文件夹用来保存数据集&#xff0c;在data_set文件夹下创建新文件夹"flower_data"&#xff0c;点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/exampl…

基于TLS的抓包内容分析解决方法

https网络包传输过程中经SSL/TSL加密后&#xff0c;在协议分析工具中&#xff08;如wireshark&#xff09;对于应用层http内容数据无法分析。要解决这个问题&#xff0c;可以参考以下2种方法&#xff0c; &#xff08;1&#xff09;配置SSLKEYLOGFILE环境变量配置wireshark TLS…

由浅入深学习nginx

nginx&#xff08;高性能的http和反向代理服务器&#xff09;的优点&#xff1a; &#xff08;1&#xff09;占有内存少 &#xff08;2&#xff09;并发能力强&#xff08;支持5万个&#xff09; &#xff08;3&#xff09;专为性能优化而开发 nginx主要可以实现的功能有这么几…

FL Studio2024破解版激活码许可证

fl studio 21中文版具备直观的界面和强大的编辑功能&#xff0c;使您能够轻松地调整和精确控制音频轨道。您可以实时录制、编辑和处理多个音轨&#xff0c;轻松实现混音和编曲。无论您是专业音乐制作人还是初学者&#xff0c;都能满足您的需求&#xff0c;并帮助您实现创作梦想…

正则表达式[总结]

文章目录 1. 为什么要学习正则表达式2. 再提出几个问题&#xff1f;3. 解决之道-正则表达式4. 正则表达式基本介绍5. 正则表达式底层实现(重要)6. 正则表达式语法6.1 基本介绍6.2 元字符(Metacharacter)-转义号 \\\6.3 元字符-字符匹配符6.4 元字符-选择匹配符6.5 元字符-限定符…

Git学习笔记——超详细

Git笔记 安装git&#xff1a; apt install git 创建版本库&#xff1a; git init 添加文件到版本库&#xff1a; git add 文件 提交文件到仓库&#xff1a; git commit -m “注释” 查看仓库当前的状态信息&#xff1a; git status 查看修改内容和之前版本的区别&am…

抖音热搜榜:探索热门话题,引领潮流新风尚

在信息爆炸的时代&#xff0c;我们每天都在接收大量的新鲜资讯。而作为短视频领域的佼佼者&#xff0c;抖音已经成为了众多网友获取信息、娱乐休闲的重要平台。抖音热搜榜更是凭借其独特的魅力&#xff0c;吸引了无数用户的关注。本文将为您深度解析抖音热搜榜&#xff0c;带您…

vue2 element手术麻醉信息系统源码,手术预约、手术安排、排班查询、手术麻醉监测、麻醉记录单

手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范麻醉科的工作流程&#xff0c;实现麻醉手术过程的信息数字化&#xff0c;自动生成麻…

顺应趋势,用大数据精准营销抓住大数据时代的机遇

想先问大家一个问题&#xff1a;“你觉得现在的营销好做吗&#xff1f;”想必大多数人在说到自己如何营销这一点上&#xff0c;都有道不完的“苦水”。“现在找客户难&#xff0c;投了几十万的广告费&#xff0c;真正来的客户却少得可怜&#xff0c;平均获客成本高得吓人”一位…

AD9371 官方例程HDL详解(一)

文章目录 前言一、AD9371 ----> FMC_DP二、FMC_DP ----> FPGA_TX/RX三、rx_data_x and tx_data_x must be connected to the same channel四、ADRV9009 前言 axi_ad9371_tx_jesd --> util_ad9371_xcvr接口映射讲解 一、AD9371 ----> FMC_DP AD9371内部原理图 …

[计算机网络基础]数据链路层

相比于网络层,数据链路层的内容多而且很杂,因为同时涉及到一些物理和网络的东西,甚至内容很冗杂.因为一些原因,这篇文章将主要以对比为主,而不是完全树形展开,方便各位看官理解. 这篇我估计要写上整整两天......太多了......各位看官尤其是同学们,来个赞/收藏/关注呗 1.关于数…

StudioOne升级6.5版本,最新功能测评

PreSonus流行的Studio One DAW的最新更新现已发布&#xff0c;标题功能是许多用户一直在等待的&#xff1a;支持包括杜比全景声在内的沉浸式音频格式。该软件的分数编辑器也已更新&#xff0c;以及其他一些一般增强和改进&#xff0c; 集成 Dolby Atmos 的 Studio One 正式发布…

【JavaEE】CAS -- 多线程篇(7)

CAS 1. 什么是 CAS2. CAS 伪代码3. CAS 是怎么实现的4. CAS的应用4.1 实现原子类4.2 实现自旋锁 5. CAS 的 ABA 问题 1. 什么是 CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“能够比较和交换 某个寄存器中的值和内存中的值, 看是否相等, 如果相等, 则把另…

三、组件与数据交互

一、组件基础 1、单文件组件 第一步&#xff1a;引入组件 import ComponentTest from ./components/ComponentTest.vue 第二步&#xff1a;挂载组件 components: {ComponentTest } 第三步&#xff1a;显示组件 <ComponentTest></ComponentTest><!-- 父组件 --…