模板—字符串—AC自动机(多模式串,单文本串)

Code:

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. #define N 1000010
  7. int ch[N][26],fl[N],head[N],to[N],nxt[N],size[N],pos[N],en[N],n,ans; char str[N];
  8. namespace AC
  9. {
  10. int idx,cnt;
  11. void add(int a,int b) {nxt[++idx]=head[a],to[idx]=b,head[a]=idx;}
  12. void insert(int id,int len)
  13. {
  14. int p=0;
  15. for(int i=1;i<=len;i++)
  16. {
  17. if(!ch[p][str[i]-'a'])
  18. ch[p][str[i]-'a']=++cnt;
  19. p=ch[p][str[i]-'a'];
  20. } pos[id]=p,en[p]++;
  21. }
  22. void dfs(int p)
  23. {
  24. size[p]=1;
  25. for(int i=head[p];i;i=nxt[i])
  26. dfs(to[i]),size[p]+=size[to[i]];
  27. }
  28. void bfs()
  29. {
  30. idx=0; queue <int> q;
  31. for(int i=0;i<26;i++) if(ch[0][i])
  32. q.push(ch[0][i]),add(0,ch[0][i]);
  33. while(!q.empty())
  34. {
  35. int p=q.front(); q.pop();
  36. for(int i=0;i<26;i++)
  37. {
  38. int &v=ch[p][i];
  39. if(!v) {v=ch[fl[p]][i];continue;}
  40. fl[v]=ch[fl[p]][i],q.push(v),add(fl[v],v);
  41. }
  42. } dfs(0);
  43. }
  44. void find(int l)
  45. {
  46. int p=0;
  47. for(int i=1;i<=l;i++)
  48. {
  49. p=ch[p][str[i]-'a']; if(!p) return;
  50. for(int j=p;j&&en[j]!=-1;j=fl[j])
  51. ans+=en[j],en[j]=-1;
  52. }
  53. }
  54. }
  55. using namespace AC;
  56. int main()
  57. {
  58. scanf("%d",&n);
  59. for(int i=1;i<=n;i++) scanf("%s",str+1),insert(i,strlen(str+1)); bfs();
  60. scanf("%s",str+1),find(strlen(str+1)),printf("%d\n",ans);
  61. }

  

模板—字符串—AC自动机(多模式串,单文本串)的更多相关文章

  1. 模板—字符串—KMP(单模式串,单文本串)

    模板—字符串—KMP(单模式串,单文本串) Code: #include <cstdio> #include <cstring> #include <algorithm& ...

  2. AC 自动机——多模式串匹配

    网站上的敏感词过滤是怎么实现的呢? 实际上,这些功能最基本的原理就是字符串匹配算法,也就是通过维护一个敏感词的字典,当用户输入一段文字内容后,通过字符串匹配算法来检查用户输入的内容是否包含敏感词. B ...

  3. P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  4. 【学时总结&模板时间】◆学时·10 & 模板·3◆ AC自动机

    ◇学时·10 & 模板·3◇ AC自动机 跟着高中上课……讲AC自动机的扩展运用.然而连KMP.trie字典树都不怎么会用的我一脸懵逼<(_ _)> 花一上午自学了一下AC自动机 ...

  5. (模板)AC自动机模板

    模板1. 给出模式串和文本串,文本串长度小于1e6,模式串长度之和小于1e6,求文本串中有多少模式串出现. 题目链接:https://www.luogu.org/problem/P3808 AC co ...

  6. 洛谷P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

  7. P3796 【模板】AC自动机(加强版)

    P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串 ...

  8. 模板】AC自动机(简单版)

    模板]AC自动机(简单版) https://www.luogu.org/problemnew/show/P3808 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保 ...

  9. 【刷题】洛谷 P3808 【模板】AC自动机(简单版)

    题目背景 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 管理员提示:本题数据内有重复的单词,且重复单词应该计算多次, ...

随机推荐

  1. DOS程序员手册(十三)

    744页 在DPMI 1.0下,系统会修改并重新装载所有含选择符的段寄存器,并且将所有 含有要释放的选择符的寄存器清空为0. 客户程序绝不能修改或释放该功能分配的任何描述符.Int 31h.功能010 ...

  2. python3 打印九九乘法口诀表

    for i in range(1, 10): for j in range(1, i+1): # print(f'{i}×{j}={i*j}', end='\t') print('%d×%d=%d' ...

  3. 自动化测试(二)如何用python写一个用户登陆功能

    需求信息: 写一个判断登录的程序: 输入: username password 最大错误次数是3次,输入3次都没有登录成功,提示错误次数达到上限 需要判断输入是否为空,什么也不输入,输入一个空格.n个 ...

  4. linux->centos7设置tomcat开机自启

    找到/etc/rc.d/文件下的rc.local,添加如下内容 export JAVA_HOME=/usr/local/jdk1.8.0_144export JRE_HOME=$JAVA_HOME/j ...

  5. ironic images

    参考: http://blog.csdn.net/wanghuiict/article/details/52757359 ironic 整个部署流程中有两组映像,分别是 deploy 映像和 user ...

  6. vue 搜索匹配

    computed: { broSeachData: function() { var browesData = this.browesData, searchVal = this.searchVal; ...

  7. mysql5.6版本修改密码

     UPDATE user SET Password=PASSWORD('新密码') WHERE User='root'; 

  8. 【干货】2个小时教你hexo博客添加评论、打赏、RSS等功能 (转)

    备注:该教程基于Hexo 2.x版本,目前Hexo是3.x版本,照本教程实现有可能会出现404错误,笔者目前还未找时间去解决,待笔者找时间解决该问题后,再写一篇该问题的解决教程,给各位读者带来困扰,还 ...

  9. xpath属性值的模糊匹配

    得至:http://bbs.csdn.net/topics/390857942  最后一楼 //div[contains(@class,'Number Skill')]

  10. 自适应注意力机制在Image Caption中的应用

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...