AC_Automata模板
#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模板相关推荐
- VS Code 安装插件、自定义模板、自定义配置参数、自定义主题、配置参数说明、常用的扩展插件
1. 下载和官网教程 下载地址:https://code.visualstudio.com/ 官方教程:https://code.visualstudio.com/docs 2. 安装插件 安装扩展插 ...
- SpringBoot (三) :SpringBoot使用Freemarker模板引擎渲染web视图
什么是Freemarker FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而 ...
- SpringBoot-web开发(三): 模板引擎Thymeleaf
[SpringBoot-web系列]前文: SpringBoot-web开发(一): 静态资源的导入(源码分析) SpringBoot-web开发(二): 页面和图标定制(源码分析) 目录 1. 引入 ...
- 二分查找模板全面总结
二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...
- Django 模板HTML转义和CSRF4.3
Django对字符串进行自动HTML转义,如在模板中输出如下值: 视图代码: def index(request):return render(request, 'temtest/index2.htm ...
- Django 模板继承4.2
模板继承 模板继承可以减少页面内容的重复定义,实现页面内容的重用 典型应用:网站的头部.尾部是一样的,这些内容可以定义在父模板中,子模板不需要重复定义 block标签:在父模板中预留区域,在子模板中填 ...
- Django 模板4.1
模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视 ...
- Django 视图和模板1.4
视图 在django中,视图对WEB请求进行回应 视图接收reqeust对象作为第一个参数,包含了请求的信息 视图就是一个Python函数,被定义在views.py中 #coding:utf-8 fr ...
- [JAVA EE] Thymeleaf 高级用法:模板布局,带参数的引用片段,表单验证,常用校验注解
模板布局 公共部分通常定义为模板布局:如页眉,页脚,公共导航栏.菜单等. 模板布局定义方法 布局页中用 th:fragment 定义模板片段,其他页面用 th:insert 引用片段 例如:foote ...
最新文章
- pci 中断冲突_Linux 内核PCI 中断
- 「AI不惑境」学习率和batchsize如何影响模型的性能?
- Python基本语法_函数_参数的多类型传值
- Tomcat类加载器机制
- 机器学习算法进阶——决策树和随机森林
- SVM学习(一):SVM概念
- 字节码编辑器JClassLIb下载教程
- 从ajax获取的数据无法通过Jquery选择器来调用事件
- python面向对象遇见问题
- python语言能做什么-Python是什么_python能做什么
- VMware虚拟机迁移
- Topaz Sharpen A I人工智能清晰锐化PS插件
- IDEA中使用Git,文件不同颜色代表的含义
- 一个简单的(基于redisson的)分布式同步工具类封装
- C/C++ libcurl CURLOPT_NOSIGNAL选项
- UVa10019:Funny Encryption Method
- 【开源】这个人脸生成器厉害了,网红脸、明星脸、萌娃脸通通都有
- Android 手机拨号
- C4D骨骼动画绑定到像素
- 计算机一级是word2010,WORD2010讲义计算机一级