博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC自动机
阅读量:6206 次
发布时间:2019-06-21

本文共 1199 字,大约阅读时间需要 3 分钟。

假设手里有N个串,和原文进行匹配,如果跑KMP,得把原文跑N次,实在是太费时间了。AC自动机借助于Trie的压缩功能,将多个串压成一个“树”,用这个树进行KMP,这就是贝尔实验室发明的AC自动机。
AC自动机主要有三个操作;insert,getfail,print,find。
insert的操作和Trie一样。
void Insert(string str,int v){    int u=0,c;    for(int i=0;i
insert的操作

getfail采用BFS,逐个检查,记录后缀链接last数组

void GetFail(){    queue
Q; f[0]=0; for(int c=0;c<26;c++) { int u=ch[0][c]; if(u) { f[u]=last[u]=0; Q.push(u); } } while(!Q.empty()) { int r=Q.front();Q.pop(); for(int c=0;c<26;c++) { int u=ch[r][c]; if(!u) { ch[r][c]=ch[f[r]][c]; continue; } Q.push(u); int v=f[r]; while(v&&!ch[v][c]) v=f[v]; f[u]=ch[v][c]; last[u]=val[f[u]]?f[u]:last[f[u]]; } }}
getfail的操作

find对应的是原文

void Find(string str){    int j=0,c;    for(int i=0;i
find的操作

print表示在确定一个串后的操作

void print(int j){    if(j)    {        cnt[val[j]]++;        print(last[j]);    }}
print的操作

整个自动机中,最重要的是后缀链接last数组的使用,对于一个单词的尾结点,可能对应多个串,需要沿着往回走,看看有没有串了。

 

@练习题

HDU 2222

HDU 2896

HDU 3065

转载于:https://www.cnblogs.com/neopenx/p/4004407.html

你可能感兴趣的文章
微信支付申请90%的商户都卡在这儿了,申请微信支付,商户功能设置详细说明...
查看>>
高仿Instagram 页面效果android特效
查看>>
我的友情链接
查看>>
如何查找JSP页面中的错误
查看>>
2016 年总结
查看>>
将String转化成Stream,将Stream转换成String
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
Google API设计指南-资源名称
查看>>
最全React技术栈技术资料汇总(收藏)
查看>>
【工具使用系列】关于 MATLAB 遗传算法与直接搜索工具箱,你需要知道的事
查看>>
Kali-linux Arpspoof工具
查看>>
PDF文档页面如何重新排版?
查看>>
基于http协议使用protobuf进行前后端交互
查看>>
UML设计一个电影票务销售系统(四)
查看>>
AlphaGo Zero用它来调参?【高斯过程】到底有何过人之处?
查看>>
Linux平台Oracle多个实例启动说明
查看>>
bash腳本編程之三 条件判断及算数运算
查看>>
php cookie
查看>>
linux下redis安装
查看>>
Sqlserver表值函数
查看>>