做了某题之后发现trie的AC自动机太垃圾了,动不动就TLE,然后我就去学了trie图。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. struct trie
  5. {
  6. int count;
  7. trie *fail,*nxt[];
  8. trie()
  9. {
  10. count=;
  11. fail=NULL;
  12. for(int i=;i<;i++)nxt[i]=NULL;
  13. }
  14. }*q[],*root=new trie();
  15. int head,tail;
  16. char keyword[],str[];
  17.  
  18. void insert(char s[],trie *root)
  19. {
  20. int i=,index;
  21. trie *p=root;
  22. while(s[i])
  23. {
  24. index=s[i]-'a';
  25. if(p->nxt[index]==NULL)p->nxt[index]=new trie();
  26. p=p->nxt[index];
  27. i++;
  28. }
  29. p->count++;
  30. }
  31. void build_ac(trie *root)
  32. {
  33. q[++tail]=root;
  34. while(head!=tail)
  35. {
  36. trie *p=q[++head];
  37. for(int i=;i<;i++)
  38. if(p->nxt[i]!=NULL)
  39. {
  40. if(p==root)p->nxt[i]->fail=p;
  41. else p->nxt[i]->fail=p->fail->nxt[i];
  42. q[++tail]=p->nxt[i];
  43. }
  44. else
  45. {
  46. if(p==root)p->nxt[i]=p;
  47. else p->nxt[i]=p->fail->nxt[i];
  48. }
  49. }
  50. }
  51. int ask(trie *root)
  52. {
  53. trie *p=root;
  54. int i=,index,cnt=;
  55. while(str[i])
  56. {
  57. index=str[i]-'a';
  58. p=p->nxt[index];
  59. trie *temp=p;
  60. while(temp!=root && temp->count!=-)
  61. cnt+=temp->count,temp->count=-,temp=temp->fail;
  62. i++;
  63. }
  64. return cnt;
  65. }
  66. signed main()
  67. {
  68. int n,T;
  69. trie *p;
  70. cin>>T;
  71. while(T--)
  72. {
  73. p=new trie();
  74. cin>>n;
  75. for(int i=;i<=n;i++)
  76. {
  77. cin>>keyword;
  78. insert(keyword,p);
  79. }
  80. cin>>str;
  81. build_ac(p);
  82. cout<<ask(p)<<endl;
  83. }
  84. }

模板—trie图的更多相关文章

  1. Trie图(模板)

    Trie图(蒟蒻听说AC自动机能做的题Trie图都能做,而且AC自动机可能被卡,就没学过AC自动机),最近想捡一捡,好久之前做的了. Trie图,就是一个在Trie树上建的图  大概描述一下 比如说有 ...

  2. Trie图 模板

    trie图实际上是优化的一种AC自动机. trie图是在trie树上加一些失配指针,实际上是类似KMP的一种字符串匹配算法. 失配指针类似KMP的nx数组,有效地利用了之前失配的信息,优化了时间复杂度 ...

  3. 【hihoCoder 1036】Trie图

    看了一下简单的$Trie图$,调模板调啊调一连调了$2h$,最后发现$-'a'$打成$-'A'$了hhh,有种摔键盘的冲动. $Trie图$是$Trie树$上建立“前缀边”,不用再像在$Trie树$上 ...

  4. 【AC自动机&&Trie图】积累

    以前KMP和后缀系列(主要是后缀数组,后缀自动机),都刷了一定数量的题,但是对于AC自动机,却有些冷落,罪过. 但是我感觉,在蓝桥杯比赛中AC自动机出现的概率比后缀系列大,简单的会考匹配,稍难一点会考 ...

  5. 小菜鸟 菜谈 KMP->字典树->AC自动机->trie 图 (改进与不改进)

    本文的主要宗旨是总结自己看了大佬们对AC自动机和trie 图 的一些理解与看法.(前沿:本人水平有限,总结有误,希望大佬们可以指出) KMP分割线--------------------------- ...

  6. POJ 2778 DNA Sequence ( AC自动机、Trie图、矩阵快速幂、DP )

    题意 : 给出一些病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 分析 : 这题搞了我真特么久啊,首先你需要知道的前置技能包括 AC自动机.构建Trie图.矩阵快速幂,其中矩 ...

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

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

  8. 【hihoCoder】1036 Trie图

    题目:http://hihocoder.com/problemset/problem/1036 给一个词典dict,词典中包含了一些单词words.要求判断给定的一个文本串text中是否包含这个字典中 ...

  9. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

    涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...

随机推荐

  1. Ubuntu midi 播放

    One of the simplest methods to play a midi file in Ubuntu is to install timidity. sudo apt-get insta ...

  2. UI:使用 pod 引入 AFNetworking

    cocdpods的安装  参考1  参考2 参考3 注意:MVC是一种搭建项目的思想,不是设计模式. 使用第三方管理控件: 引入CocoaPods的详细步骤:(1)检测有没有引入淘宝镜像gem sou ...

  3. selenium中关于driver的小记

    1:  Ubuntu系统将driver放入 /usr/bin 目录下,即可直接启动浏览器. 2:  WIN10系统讲Driver放入python安装的根目录下,即可直接启动浏览器. 3:  WIN10 ...

  4. window切换Java版本原因

    查找Path环境变量的变量指向的目录,有一个Oracle目录存放着几个 java,javac等可执行文件,删除这个路径或文件就可以执行你指定的JavaHome目录拉 详情参考: https://blo ...

  5. E20170519-ts

    numeric adj. 数字的; 数值的; nibble   vt. 啃,一点一点地咬(吃); rational adj. 理性的; 合理的; n. 合理的事物; [数] 有理数; numerato ...

  6. P5071 [Ynoi2015]此时此刻的光辉

    传送门 lxl大毒瘤 首先一个数的因子个数就是这个数的每个质因子的次数+1的积,然后考虑把每个数分解质因子,用莫队维护,然后我交上去就0分了 如果是上面那样的话,我们每一次移动指针的时间复杂度是O(这 ...

  7. 关于自增id 你可能还不知道

    导读:在使用MySQL建表时,我们通常会创建一个自增字段(AUTO_INCREMENT),并以此字段作为主键.本篇文章将以问答的形式讲述关于自增id的一切. 注: 本文所讲的都是基于Innodb存储引 ...

  8. LuoguP1314 聪明的质检员 【二分答案/前缀和】

    美丽的题号预示着什么... 描述 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi.检验矿产的流程是: 1.给定m个 ...

  9. 如何实现Docker镜像和容器实例的备份迁移

    题记 大家在使用Docker都会从容器仓库下载镜像,不过这个过程可能依据网络带宽而定,那么如果将一个已经下载好的镜像迁移到另外一个环境中,或者说如何实现Docker容器的备份恢复,或者迁移,接下来我们 ...

  10. layer 确认或取消后跳转

    layer.open({ content: "下单成功" , btn: ['确定','取消'], style: 'width:80%', yes: function(index, ...