「Day-2 提高笔记-字典树」

news/2024/10/21 16:07:20

字典树

字典树是什么?

理论知识

  1. 插入操作

我们在插入的时候,先从根节点去向下遍历。对于字符串 \(S\) 的一位 \(S_i\)

  • 如果发现其在字典树中当前节点下有这个字符 \(S_i\),则继续向下,在向下的过程中每次给当前节点的次数加 \(1\),记录字符串前缀数量。
  • 若无这个字符,则开辟一个新的节点,记录节点编号,继续向下。
  1. 查询前缀数量

我们在查询前缀的时候,先从根节点去向下遍历。对于字符串 \(S\) 的一位 \(S_i\)

  • 若在字典树当前节点下没有 \(S_i\),则证明没有以该前缀为开头的单词。
  • 否则就继续向下,直到 \(S_n\),最后返回该节点数下的前缀数量。

时间复杂度

对于一个长度为 \(n\) 字符串。
\(Insert\)\(query\) 的时间复杂度都是 \(O(n)\)

代码实现

P8306 【模板】字典树

#include<bits/stdc++.h>
using namespace std;const int MAXN = 3e6 + 5;
int T;
int n,q;
char s[MAXN];
int ch[MAXN][100],cnt[MAXN],id = 0;int got(char c){if(c >= 'A' && c <= 'Z') return c - 'A';if(c >= 'a' && c <= 'z') return c - 'a' + 26;return c - '0' + 52;
}void Insert(char *s){int now = 0;for(int i = 0;s[i];i ++){int v = got(s[i]);if(!ch[now][v]){ch[now][v] = ++ id;}now = ch[now][v];cnt[now] ++; }return;
}int query(char *s){int now = 0;for(int i = 0;s[i];i ++){int v = got(s[i]);if(!ch[now][v]) return 0;now = ch[now][v];}return cnt[now];
}void Clear(){memset(ch, 0, sizeof(ch[0]) * (id + 1));memset(cnt, 0, sizeof(cnt[0]) * (id + 1));id = 0;
}signed main(){scanf("%d",&T);while(T --){scanf("%d%d",&n,&q);for(int i = 1;i <= n;i ++){scanf("%s",s);Insert(s);}for(int i = 1;i <= q;i ++){scanf("%s",s);cout << query(s) << '\n';}Clear();}return 0;
}

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

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

相关文章

【软件工程】团队作业1

这个作业属于哪个课程 广工计院计科34班软工这个作业要求在哪里 作业要求这个作业的目标 创立团队,分工合作,团队展示,熟悉软件开发整体流程,提升自身能力一、团队展示队名:小飞棍队团队项目简介:工大严选(基于 Vue3 构建的购物平台,界面简洁直观,分类明确,技术高效,…

2024.10.16 鲜花

取模优化PRAGMATISM -RESURRECTION 凭什么没词就不是好歌!!!取模优化 就不讲怎么减少取模了。 比较广为流传的有两种,Barrett reduction,Montgomery Algorithm。 对于固定常数模数,计算机已经优化的很好了,一般不会有太大效果(确实有,用 Barrett reduction 有时可以卡…

每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))

前言 每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量。 想细看的可以去官网下载,或者下面自取 阿里巴巴Java开发手册(终极版) 五、集合…

element-plus框架样式设置不生效

问题:在element-plus的菜单组件中,二级菜单折叠,然后鼠标悬浮的时候,出现的内容是有内边距,我想去掉,如图:但是在控制台找到了相应的类,需要把padding设置为0。我通过如下代码设置不生效,原因:可能是生成的二级菜单样式里面没有带特定的hash属性 而vue代码里面样式里…

IDEA如何进行阿里巴巴编码规约扫描并导出报告

前言 我们在使用IDEA开发Java应用时,可以安装很多的插件来帮助我们高效的开发代码。 我们需要注意开发的编码规范,这时候就可以安装一款很有名的插件,阿里巴巴的编码规约插件。可以用这个插件,对我们的代码进行扫描,并且导出报告,那么我们应该怎么操作呢? 如何扫描代码并…

Java 集成阿里云发送短信

首先要有个阿里云账号,可到阿里云登录页注册并登录。 登录后访问短信服务快速学习和测试,其中有逐步介绍如何发送短信:新增资质 新增资质相当于进行实名认证,资质是申请签名的实名化信息。申请签名 签名是短信中能代表发送者属性的字段。一般就是公司名字。发送短信时,签名…

计量经济学(七)——时间序列GARCH模型

img { display: block; margin-left: auto; margin-right: auto } table { margin-left: auto; margin-right: auto } 金融市场中的波动性建模是金融计量经济学的重要研究内容。时间序列数据,尤其是金融市场数据,往往表现出强烈的波动聚集现象,这意味着波动率在某些时期较高…

IDEA如何打开左右两个窗口方便代码对比

前言 我们在使用IDEA开发时,有时候会遇到一个问题,就是我们会想复制一个文件里面的好几处内容到另外一个文件中。但是这样会频繁的切换两个文件,也不太方便。这时,我们就可以用IDEA左右分别打开两个文件,左右对比着看。那么,我们应该如何操作呢? 如何操作 首先,我们把我…