KMP

void kmp(char t[],char p[])
{
int n=strlen(t),m=strlen(p);
int *f=new int[m];
f[0]=f[1]=0;
for(int i=1;i<m;++i)
{
int j=f[i];
while(j&&p[i]!=p[j])j=f[j];
f[i+1]=p[j]==p[i]?j+1:0;
}
for(int i=0,j=0;i<n;++i)
{
while(j&&t[i]!=p[j])j=f[j];
if(t[i]==p[j])j++;
if(j==m)printf("%d\n",i-m+1);
}
delete[] f;
}

Aho-Corasick automa

Trie + fail[] & last[] + matching

int fail[int i]失配函数,注意i和fail[i]结点对应的字母相同;f[0]=0,f[ch[0][u]]=0。

int last[int i]沿失配函数往回走遇到的第一个单词结点。(可选)

输出所有与前i位的后缀匹配的单词的val值

可能有错

const int maxn=1e6+5;
struct trie
{
int ch[500010][26],val[maxn],fail[maxn],last[maxn];
int sz;
trie(){sz=0;ms(ch[0],0);}
void Insert(char s[],int v)
{
int u;for(u=0;*s;++s){if(!ch[u][*s-'a']){ch[u][*s-'a']=++sz;ms(ch[sz],0);}u=ch[u][*s-'a'];val[u]=0;}
val[u]=v;
}
void GetFailLast()
{
queue<int> q;while(!q.empty())q.pop();q.push(0);fail[0]=0;for(int i=0;i<26;++i)fail[ch[0][i]]=0;
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=0;i<26;++i)
{
int v=ch[u][i],t=fail[u];;if(!v)continue;
q.push(v);
while(t&&!ch[t][i])t=fail[t];
fail[v]=ch[t][i];last[v]=val[fail[v]]?fail[u]:last[fail[v]];
}
}
}
void Query(char s[])
{
for(int u=0,i=0;*s;s++,i++){while(u&&!ch[u][*s-'a'])u=fail[u];u=ch[u][*s-'a'];int tmp=val[u]?u:last[u];while(tmp)printf("%d %d\n",i,val[tmp]),tmp=last[tmp];}
}
}T;

另一版本

  • ch[][]给出了自动机状态转移图的完整邻接表
  • 加上根结点一共sz个结点,其中根结点标号为0,其余分别为1,...,sz-1
  • 查询时,每一步都需要沿fail[]往回检查
  • -1表示结点不存在(用memset初始化是可行的。memset可以初始化0和-1)
const int sigma_size=26,max_node=100;
struct Trie
{
int ch[max_node][sigma_size],val[max_node],fail[max_node],sz;
int newnode(){memset(ch[sz],-1,sizeof ch[sz]);val[sz]=0;return sz++;}
void init(){sz=0;newnode();}
void insert(char s[],int v)
{
int u;for(u=0;*s;++s){if(ch[u][*s-'a']==-1)ch[u][*s-'a']=newnode();u=ch[u][*s-'a'];}
val[u]=v;
}
void build()
{
queue<int>q;
for(int i=0;i<sigma_size;++i)
{
int &v=ch[0][i];
if(v==-1)v=0;
else {fail[v]=0;q.push(v);}
}
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=0;i<sigma_size;++i)
{
int &v=ch[u][i];
if(v==-1)v=ch[fail[u]][i];
else{fail[v]=ch[fail[u]][i];q.push(v);}
}
}
}
void query(char s[])
{
for(int u=0,t,cnt=0;*s;++s,++cnt)
{
t=u=ch[u][*s-'a'];
while(t){if(val[t])printf("%d %d\n",cnt,val[t]);t=fail[t];}
}
}
}T;

KMP & AC自动机的更多相关文章

  1. 字符串的模板 Manacher kmp ac自动机 后缀数组 后缀自动机

    为何scanf("%s", str)不需要&运算 经常忘掉的字符串知识点,最好不加&,不加&最标准,指针如果像scanf里一样加&是错的,大概是未定 ...

  2. Trie树&kmp&AC自动机&后缀数组&Manacher

    Trie 计数+Trie,读清题意很重要 https://vjudge.net/problem/UVALive-5913 kmp AC自动机 模板:https://vjudge.net/problem ...

  3. 2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机)

    2021.11.09 P4824 [USACO15FEB]Censoring S与P3121 [USACO15FEB]Censoring G(KMP&&AC自动机) https://w ...

  4. 关于Trie KMP AC自动机

    个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转) 而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也 ...

  5. hdu1686 Oulipo KMP/AC自动机

    The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...

  6. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组

    题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...

  7. 优先队列 + 并查集 + 字典树 + 欧拉回路 + 树状数组 + 线段树 + 线段树点更新 + KMP +AC自动机 + 扫描线

    这里给出基本思想和实现代码 . 优先队列 : 曾经做过的一道例题       坦克大战 struct node { int x,y,step; friend bool operator <(no ...

  8. AC自动机【萌新文章】

    我这个蒟蒻第一次写博客,有点小激动呢. 主要是最近刚学了AC自动机,学得糟糟糕糕,记录一下,看到dalao们都在写博客,决定自己也写一波[我好水的啦,写的也不好] AC自动机大概就是    Trie+ ...

  9. 【BZOJ3940】【BZOJ3942】[Usaco2015 Feb]Censoring AC自动机/KMP/hash+栈

    [BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hoov ...

随机推荐

  1. Java 程序该怎么优化?(命令篇)

    灵魂拷问,JDK 提供的命令,除了 java.javac,你还用过哪些命令呢? 灵魂再拷问,若你写的 Java 程序,出现了性能问题,该怎么去排查呢? Java 作为编程语言中的战斗机,JDK 默认已 ...

  2. Elasticsearch7.6学习笔记1 Getting start with Elasticsearch

    Elasticsearch7.6学习笔记1 Getting start with Elasticsearch 前言 权威指南中文只有2.x, 但现在es已经到7.6. 就安装最新的来学下. 安装 这里 ...

  3. 001_Chrome 76支持原生HTML 图片懒加载Lazy loading

    Table Of Content 什么是懒加载? 语法参数及使用方式? 有哪些特点? 与js有关的实践 什么是懒加载? 技术背景 Web应用需要经常向后台服务器请求资源(通过查询数据库,是非常耗时耗资 ...

  4. JavaScript RegExp.​$1...$9 属性详解

    RegExp.$1...$9属性用于返回正则表达式模式中某个子表达式匹配的文本. 正则表达式中每个小括号内的部分表达式就是一个子表达式. 该属性是RegExp全局对象的一个只读属性,所有主流浏览器均支 ...

  5. MyBatis(一):第一个MyBatis程序

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出1便就懂!b站搜索狂神说即可 https://space.bilibili.com/95256449?spm_id_from=333.788 ...

  6. C语言 文件操作(七)

    C语言获取文件状态 stat() #include <sys/stat.h> #include <unistd.h> int stat(const char *file_nam ...

  7. spark sql error mismatched input 'union' expecting { <EOF>,''................................

    给union的前后sql加括号就可以解决

  8. python3(十二)functional

    # 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数! # 变量可以指向函数 abs(-10) abs # <built-in function abs> ...

  9. 【python实现卷积神经网络】padding2D层实现

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  10. 恶劣的网络环境下,Netty是如何处理写事件的?

    更多技术分享可关注我 前言 前面,在Netty在接收完新连接后,默认为何要为其注册读事件,其处理I/O事件的优先级是什么?这篇文章,分析到了Netty处理I/O事件的优先级——读事件优先,写事件仅仅是 ...