题目描述

Trie 图就是在 Trie 树上建立 fail 指针,类似于KMP算法中的next数组的作用。

这个数据结构的作用是判断一个字符串中是否包含一组字符串中的任意一个。

结构体定义是这样的:

typedef
struct trie_node {trie_node *nodes[26];trie_node *fail = NULL;bool word_end = false;trie_node() {for (int i = 0; i < 26; i++) {nodes[i] = NULL;}}
} Trie, *PTrie;

与KMP类似,fail的定义如下:

记S[pnode]为从proot到pnode构成的字符串,所有满足S[i]是S[node]后缀串的节点i构成集合M,pnode->fail是集合M中使得S[pnode->fail]字符串长度最长的节点。

定义起来很拗口,但是如果理解KMP算法的话,fail和next的定义几乎一样。

求法也是相似的,用父节点的fail指针迭代求解。由于要利用父节点的信息,所以用层次遍历(bfs)的方法求解Trie树上每个节点的fail。

void trie_map(PTrie proot) {queue<PTrie> q;proot->fail = NULL;q.push(proot);while (!q.empty()) {PTrie pnode = q.front();q.pop();PTrie pfail;for (int i = 0; i < 26; i++) {if (pnode->nodes[i] != NULL) {q.push(pnode->nodes[i]);pfail = pnode->fail;while (pfail != NULL) {if (pfail->nodes[i]) break;else pfail = pfail->fail;}pnode->nodes[i]->fail = pfail == NULL ? proot : pfail->nodes[i];}}}
}

hexie词匹配就是在树上不断匹配当前字符,遇到不匹配就转到fail节点继续匹配当前字符,一旦途中走到了一个单词结尾的节点就返回1,若匹配完整个字符串还没有返回,说明没有匹配到hexie词,返回0。

bool hexie(PTrie proot, char *str) {PTrie pcur = proot;int str_len = strlen(str);for (int i = 0; i < str_len; i++) {int pos = str[i] - 'a';if (pcur->nodes[pos] != NULL) {pcur = pcur->nodes[pos];}else {pcur = pcur->fail;if (pcur == NULL) {pcur = proot;continue;}i--;}if (pcur->word_end) return true;}return false;
}

总而言之,Trie图跟KMP很像。可以说KMP是Trie图的特例、KMP是Trie树退化成链表后构成的Trie图。理解了KMP与Trie树,Trie图应该不在话下。

转载于:https://www.cnblogs.com/xblade/p/4454185.html

[hiho 04]Trie图相关推荐

  1. hiho一下 第四周 Hihocoder #1036 : Trie图

    #1036 : Trie图 时间限制:20000ms 单点时限:1000ms 内存限制:512MB 描述 前情回顾 上回说到,小Hi和小Ho接受到了河蟹先生伟大而光荣的任务:河蟹先生将要给与他们一篇从 ...

  2. 【Trie图】Hiho4_Hihocoder

    前情回顾 上回说到,小Hi和小Ho接受到了河蟹先生伟大而光荣的任务:河蟹先生将要给与他们一篇从互联网上收集来的文章,和一本厚厚的河蟹词典,而他们要做的是判断这篇文章中是否存在那些属于河蟹词典中的词语. ...

  3. 【BZOJ-2938】病毒 Trie图 + 拓扑排序

    2938: [Poi2000]病毒 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 609  Solved: 318 [Submit][Status][ ...

  4. hdu2457 Trie图+dp

    hdu2457 给定n个模式串, 和一个文本串 问如果修改最少的字符串使得文本串不包含模式串, 输出最少的次数,如果不能修改成功,则输出-1 dp[i][j] 表示长度为i的字符串, 到达状态j(Tr ...

  5. BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)

    题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...

  6. HiHocoder 1036 : Trie图 AC自动机

    Trie图 先看一个问题:给一个很长很长的母串 长度为n,然后给m个小的模式串.求这m个模式串里边有多少个是母串的字串. 最先想到的是暴力O(n*m*len(m)) len(m)表示这m个模式串的平均 ...

  7. POJ 1625 Censored ( Trie图 DP 高精度 )

    题意 : 给出 n 个单词组成的字符集 以及 p 个非法串,问你用字符集里面的单词构造长度为 m 的单词的方案数有多少种? 分析 : 与 POJ 2778 非常相似的一道题目,如果没有做过就尝试去了解 ...

  8. HDU 4511 小明系列故事——女友的考验 ( Trie图 DP )

    题意 :  给出编号从1 ~ n 的 n 个平面直角坐标系上的点,求从给出的第一个点出发到达最后一个点的最短路径,其中有两种限制,其一就是只能从编号小的点到达编号大的点,再者不能走接下来给出的 m 个 ...

  9. 【恋上数据结构与算法 第二季】【04】图-基础实现_遍历_拓扑排序

    持续学习&持续更新中- 学习态度:脚踏实地 [恋上数据结构与算法 第二季][04]图-基础实现_遍历_拓扑排序 图的实现方案 邻接矩阵 邻接表 图的基础接口 顶点.边的定义 图的基础实现 图的 ...

最新文章

  1. 性能测试07:服务器性能测试范围
  2. 安装mysql提示找不到msv_安装mysql服务时提示“找不到msvcp140.dll”
  3. 基于VTK的Qt应用程序开发
  4. 网管日志-06.09.26
  5. 制作win7+ubuntu +winPE+CDlinux多系统启动U盘
  6. 大院大所合作对接会7天倒计时!亮点抢先看
  7. jsp mysql更新表数据库_一个关于JSP更新数据库MySQL中的表的问题!
  8. babel-preset-env
  9. WinForm:API
  10. java 远程视频监控系统_基于JAVA的远程屏幕监控系统
  11. 算法学习(四)——alphago模型
  12. Unity UGUI 屏幕适配
  13. C#版OPOS打印(基于北洋OPOS SDK二次开发包,支持EPSON和北洋、佳博、商祺等支持标准ESC/POS指令的POS打印机)...
  14. 我私藏的那些实用的终端命令行工具
  15. fluent瞬态计算终止条件在哪里设置_五.从卡门涡街看FLUENT设置依据
  16. 2021年电工(初级)考试题库及电工(初级)最新解析
  17. 如何获取qq邮箱的秘钥
  18. iOS迅雷安装最新方法,免签稳定,看教程!
  19. 基于Java+SpringBoot+vue实现图书借阅和销售商城一体化系统
  20. 可视化小项目-全国房价分析

热门文章

  1. 旅行售货员问题 java_旅行售货员问题-分支界限法
  2. 【华为OD机试】五子棋迷【2023 B卷|100分】
  3. (day5) 自学Java——ArrayList集合
  4. 输入一个菱形的内高和外高,画出一个空心菱形
  5. 怎么把文字生成图片?三款ai绘画生成器分享
  6. 用例建模指南 作者:傅纯一 选自: IBM
  7. teradata查看正在运行的进程_goldengate 进程在oracle数据库哪个视图
  8. 参观消防队社会实践活动
  9. 消息队列超详解(以RabbitMQ和Kafka为例,为何使用消息队列、优缺点、高可用性、问题解决)
  10. JDBC中的execute与executeUpdate