#include<bits/stdc++.h>
using namespace std;
#define ll long longint ans=0;const int maxnode=1e6+7;
const int sigma_size=26;
struct AC_Automata
{  int ch[maxnode][sigma_size];  int val[maxnode];   // 每个字符串的结尾结点都有一个非0的val  int f[maxnode];     // fail函数  int last[maxnode];  // last[i]=j表j节点表示的单词是i节点单词的后缀,且j节点是单词节点  int sz;  //初始化0号根节点的相关信息  void init()  {  sz=1;  memset(ch[0],0,sizeof(ch[0]));  val[0]=0;  }  void insert(char *s,int v)  {  int u=0;  for(int i=0; s[i]; i++)  {  int id=s[i]-'a';  if(ch[u][id]==0)  {  ch[u][id]=sz;  memset(ch[sz],0,sizeof(ch[sz]));  val[sz++]=0;  }  u=ch[u][id];  }  val[u]+=v;  }  void getFail()  {  queue<int> q;  last[0]=f[0]=0;  for(int i=0; i<sigma_size; i++)  {  int u=ch[0][i];  if(u)  {  f[u]=last[u]=0;  q.push(u);  }  }  while(!q.empty())// 按BFS顺序计算fail  {  int r=q.front(); q.pop();  for(int i=0; i<sigma_size; i++)  {  int u=ch[r][i];  if(u==0)continue;  q.push(u);  int v=f[r];  //失配边尝试平行传递while(v && ch[v][i]==0) v=f[v];  f[u]= ch[v][i];  last[u] =  val[f[u]]?f[u]:last[f[u]];  }  }  }  //递归打印与结点i后缀相同的前缀节点编号  //进入此函数前需保证val[i]>0  void print(int i)  {  if(i)  {  ans+=val[i];val[i]=0;           print(last[i]);  }  }  void find(char *s)  {  int j=0;//j:trie树中的节点编号  for(int i=0; s[i]; i++)  {  int id=s[i]-'a';  while(j && ch[j][id]==0) j=f[j];//ch[j][id]:第j个节点的id字母子节点编号 j=ch[j][id];  if(val[j]) print(j);  else if(last[j]) print(last[j]);  }  }  };
AC_Automata ac;  const int maxn=1e6+7;
char ori[maxn];
char tar[maxn];int main(){int t;scanf("%d",&t);while(t--){ans=0;ac.init();int n;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%s",tar);ac.insert(tar,1);}ac.getFail();scanf("%s",ori);ac.find(ori);printf("%d\n",ans);}
}

自动机的英文念起来好中二啊,

自动机就是trie树和kmp算法的组合,多模板匹配的首选算法

两种快乐的算法重叠在一起,就有了自动机(

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

贴一个轻量化的板子,原题HDU3065

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e6+7;
const int maxm=55;
const int maxnode=1010*51;
const int sigma=128-30;int n,m;
int vis[1010];
char word[1010][55];
char ori[maxn];struct automata{int ch[maxnode][sigma];int val[maxnode];int f[maxnode];int sz;int newnode(){memset(ch[sz],0,sizeof(ch[sz]));f[sz]=val[sz]=0;return sz++;}void init(){memset(val,0,sizeof(val));sz=0;newnode();}void insert(char s[],int v){ int u=0;for(int i=0;s[i];i++){int &x=ch[u][s[i]-30];u=x?x:x=newnode();   }val[u]=v;}void build(){queue<int>q;q.push(0);   while(!q.empty()){int u=q.front();q.pop();for(int i=0;i<sigma;i++){int v=ch[u][i];if(!v)ch[u][i]=ch[f[u]][i];else q.push(v);if(u&&v)f[v]=ch[f[u]][i];}}}int find(char s[]){int j=0;for(int i=0;s[i];i++){int id=s[i]-30;j=ch[j][id];int tmp=j;while(tmp){vis[val[tmp]]++;tmp=f[tmp];}}}
}ac;int main(){while(~scanf("%d",&n)){memset(vis,0,sizeof(vis));      ac.init();for(int i=1;i<=n;i++){scanf("%s",word[i]);ac.insert(word[i],i);}ac.build();scanf("%s",ori);ac.find(ori);for(int i=1;i<=n;i++){if(vis[i])printf("%s: %d\n",word[i],vis[i]);}}
}

转载于:https://www.cnblogs.com/Drenight/p/8611322.html

AC_Automata模板相关推荐

  1. VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件

    1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...

  2. SpringBoot (三) :SpringBoot使用Freemarker模板引擎渲染web视图

    什么是Freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而 ...

  3. SpringBoot-web开发(三): 模板引擎Thymeleaf

    [SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) 目录 1. 引入 ...

  4. 二分查找模板全面总结

    二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...

  5. Django 模板HTML转义和CSRF4.3

    Django对字符串进行自动HTML转义,如在模板中输出如下值: 视图代码: def index(request):return render(request, 'temtest/index2.htm ...

  6. Django 模板继承4.2

    模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填 ...

  7. Django 模板4.1

    模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视 ...

  8. Django 视图和模板1.4

    视图 在django中,视图对WEB请求进行回应 视图接收reqeust对象作为第一个参数,包含了请求的信息 视图就是一个Python函数,被定义在views.py中 #coding:utf-8 fr ...

  9. [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解

    模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...

最新文章

  1. pci 中断冲突_Linux 内核PCI 中断
  2. 「AI不惑境」学习率和batchsize如何影响模型的性能?
  3. Python基本语法_函数_参数的多类型传值
  4. Tomcat类加载器机制
  5. 机器学习算法进阶——决策树和随机森林
  6. SVM学习(一):SVM概念
  7. 字节码编辑器JClassLIb下载教程
  8. 从ajax获取的数据无法通过Jquery选择器来调用事件
  9. python面向对象遇见问题
  10. python语言能做什么-Python是什么_python能做什么
  11. VMware虚拟机迁移
  12. Topaz Sharpen A I人工智能清晰锐化PS插件
  13. IDEA中使用Git,文件不同颜色代表的含义
  14. 一个简单的(基于redisson的)分布式同步工具类封装
  15. C/C++ libcurl CURLOPT_NOSIGNAL选项
  16. UVa10019:Funny Encryption Method
  17. 【开源】这个人脸生成器厉害了,网红脸、明星脸、萌娃脸通通都有
  18. Android 手机拨号
  19. C4D骨骼动画绑定到像素
  20. 计算机一级是word2010,WORD2010讲义计算机一级

热门文章

  1. java math rint_Java Math.rint() 方法
  2. 在页面加载完后执行jQuery代码
  3. properties文件读取内容
  4. JAVASE内测试题
  5. idea下的application.properties下写汉字乱码问题
  6. 【editor】Source Insight定制之代码风格自动校准功能(AStyle的使用)
  7. JsonPath的使用
  8. 很强大的一个jquery分页插件
  9. Elasticsearch6.X 去重
  10. c#跨线程操作控件(有UI操作)|及多线程操作