EVERYTHING HAPPENS FOR |

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-10-08 00:43阅读: 25评论: 0推荐: 0

字典树

引入

字典树(trie),顾名思义就是在字典上建树用于维护字符串的前缀相关内容。

在字典树中,每条边都是一个字符,从根节点到任意一个节点都可以代表一个字符串(例如 12611 就代表了 aba)。

模板题:P8306 【模板】字典树

结构

大致结构如上图。

对于一个节点,它需要记录它的儿子的编号,必要时还需要记录这个节点在加入字符串的操作中访问了几次(即有几个字符串有这个前缀)。

trie[i][j] 表示节点 i 走一条边权为 j 后到达的节点编号,如果不存在则设为 0

边权则使用离散化思想处理,例如 0~25 分别对应着 a~z26~51 表示 A~Z 等等。

加入字符串

id(char c) 表示 c 在离散化后的整数。

在处理新加入的字符串 s 时,从前往后枚举每一位,假设当前节点为 x,处理到了字符串的第 i 位,那么如果 trie[x][id(s[i])]0,则新增一个节点,将 x 设为新增节点编号,否则 x = trie[x][id(s[i])]

int id (char c) { // 字符映射规则
return (c >= 'a' && c <= 'z' ? c - 'a' : (c >= 'A' && c <= 'Z' ? 26 + c - 'A' : 52 + c - '0'));
}
void Insert (string s) { // 加入一个字符串
int now = 0; // 当前节点编号
for (int i = 0; i < s.size(); i++) {
if (!trie[now][id(s[i])]) { // 没有对应节点
trie[now][id(s[i])] = ++cnt; // 新建节点
}
now = trie[now][id(s[i])], sum[now]++; // 跳过去,统计数量 + 1
}
}

查询字符串

与加入差不多,但当没有对应节点时不应该新建节点,而是直接返回 0

int Query (string s) { // 查询有多少个字符串以 s 为前缀
int now = 0; // 当前节点编号
for (int i = 0; i < s.size(); i++) {
if (!trie[now][id(s[i])]) { // 没有对应节点
return 0; // 直接返回
}
now = trie[now][id(s[i])]; // 跳过去
}
return sum[now]; // 返回结果
}

模板题 Code

#include <iostream>
using namespace std;
const int N = 3e6 + 10;
int t, trie[N][65], sum[N], cnt, n, q;
string s;
int id (char c) { // 字符映射规则
return (c >= 'a' && c <= 'z' ? c - 'a' : (c >= 'A' && c <= 'Z' ? 26 + c - 'A' : 52 + c - '0'));
}
void Insert (string s) { // 加入一个字符串
int now = 0; // 当前节点编号
for (int i = 0; i < s.size(); i++) {
if (!trie[now][id(s[i])]) { // 没有对应节点
trie[now][id(s[i])] = ++cnt; // 新建节点
}
now = trie[now][id(s[i])], sum[now]++; // 跳过去,统计数量 + 1
}
}
int Query (string s) { // 查询有多少个字符串以 s 为前缀
int now = 0; // 当前节点编号
for (int i = 0; i < s.size(); i++) {
if (!trie[now][id(s[i])]) { // 没有对应节点
return 0; // 直接返回
}
now = trie[now][id(s[i])]; // 跳过去
}
return sum[now]; // 返回结果
}
void Solve () {
cnt = 0;
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> s;
Insert(s);
}
while (q--) {
cin >> s;
cout << Query(s) << '\n';
}
for (int i = 0; i <= cnt; i++) {
for (int j = 0; j < 62; j++) {
trie[i][j] = 0;
}
sum[i] = 0;
}
}
int main () {
ios::sync_with_stdio(0), cin.tie(0);
for (cin >> t; t; t--) {
Solve();
}
return 0;
}

应用

  • 检索字符串,例如模板题。
  • 01 字典树,但是不会。
  • AC 自动姬,但是也不会。

本文作者:wnsyou

本文链接:https://www.cnblogs.com/wnsyou-blog/p/trie.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(25)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 - 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 一殇/白祺/苏少安/苏栗无/公子无央/白刃昏鸦/非欢/清茗/未及昭声/汀帆/赵艹地

作曲 : 沐若

心机之蛙,一直摸你肚子

——《名侦探柯南》原创同人曲

策划:炊饭

作曲:沐若

作词:一殇、白祺、苏少安、苏栗无、公子无央、白刃昏鸦、非欢、清茗、未及昭声、汀帆、赵艹地

编曲:斓音音乐实验室

演唱:叶辞樱、温海、寒砧、南柯、小茜玛姬、墨催、阿崔Ac、贝壳初、千湛、兮茶子、乔慕、黎鹿北、起千温卿、遮阳伞、曲悠

后期:幽谷

题字/美工:徒夫

监制:楠烛

【角色-词作-歌手】

【铃木园子-一殇-叶辞樱】

没有绝对杀机

爱恨调转 对错是唯一

【赤井秀一-白祺-温海】

枪膛里银色子弹

最后的致命一击

-

【毛利小五郎-苏少安-寒砧】

沉睡倒看真相 别小瞧绅士

叼烟来探 糊涂作势

【妃英理-白祺-南柯】

剥离出实情

透过谎言再续 不败传奇

-

【苏栗无-樱/砧/海/柯】

迷茫中看见吗 向谁的真谛

让谁的眼泪 都变成迷离

罪的答案是你 路的尽头是你

-

【怪盗基德-公子无央-小茜玛姬】

Kaitou 这雪白的谜语 将帽檐压低

以滑翔翼敬礼 向手铐和你

【服部平次-白刃昏鸦-墨催】

爱与真相是唯一

十字路口 迷宫的暗语

-

【灰原哀-非欢-乔慕】

回到少年时期 退化至逃离

像天才的过去 深海的鲨鱼

【毛利兰-非欢-起千温卿】

害怕妖怪和雷雨

正义和你 是我的勇气

-

【清茗-姬/催/慕/卿/悠】

天才与罪犯在探试 我已锁定案件起始

黑暗中蛰伏无休止 被贪欲吞噬

黄昏时 布谷钟请柬送至

跋涉深渊之池 侦探们的镇魂诗

-

【目暮十三-一殇-阿崔Ac】

樱花之名起誓

追寻真相 对罪恶通缉

【阿笠博士-苏少安-贝壳初】

古怪是科学正义

热衷将永不歇止

-

【安室透-白刃昏鸦-千湛】

被隐去的名姓 真伪皆归零

谜面重启 逆向独行

【琴酒-未及昭声-兮茶子】

用死亡美学 虔诚将你献祭

无声狙击

-

【汀帆-崔/初/湛/茶】

拨开重重迷题 信仰即期许

平扫僵阵地 守一方境域

且看如何踏破 早已残废终局

-

【江户川柯南-未及昭声-黎鹿北】

真相 折射在那镜片 透视在眼底

借时间逆行 拆穿真凶伏笔

【工藤新一-公子无央-遮阳伞】

骄傲是天才之理

逐一剖析 黑色的缝隙

-

【赵艹地-鹿/伞】

转动命运齿轮 去超越世纪

继续探查疑案 来解开谜题

【贝尔摩德-赵艹地-曲悠】

最喜爱伪装神秘

卷入迷雾 从容扣动扳机

-终-

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示