专题·AC自动机
创始人
2024-03-07 07:54:57
0

初见安——!!这里是咕咕咕好久好久的樱狸QvQ

考完初赛了 有一点点的空闲时间 来整理一下博客【因为发现忘性很大……超过一个月没用的东西就记不住了QAQ

前置知识:KMP,tire树。

一、AC自动机

其实AC自动机就是在tire树上KMP。

举个例子:给你一个串S,一个串T,求T在S中出现的次数。显然KMP线性匹配。

那么如果给你一个串S,很多串T,问你每个串在S中的出现次数呢?复杂度就不保了。这时就要用到AC自动机。

比如给的是abc,aab,abcba,acb,S串是abccbacbabcba。

我们对给的串建tire树:【图丑求放过

然后在这颗树上跟着走串S。

比如我们给这个图的点编号后,

s串abccbacbabcba会依次走过:1,4,5,然后发现下一个没有c了跳不动。

根据KMP的思想,我们在trie树上令fail指针表示与KMP类似的含义,也就是失配指针。fail[i]表示trie树上从根到当前点形成的字符串的后缀匹配前缀的最长串的结尾位置。那么上图的树中我们就可以建立fail指针:

没有连边的都是指向根节点】

这样一来,当S失配后,就会沿着fail往回跳,缩小匹配的字符串。而S走的全过程中的子串都不重复,因为每走一步必然会相较于前一步多了第i个字符。所以每次形成的字符串的后缀都是答案之一

接着上文的例子,S失配没法跳c后回到根节点0,然后继续跳b,失配;跳a,跳到1,8,9;然后回到0……

我们在trie树上记录每个点为末尾代表了哪些字符串,然后就可以统计答案了。

看一个例题吧:洛谷 【模板】AC自动机(简单版)

看看代码吧——

#include
#include
#include
#include
#include
#include
#include
#define maxn 1000006
using namespace std;
typedef long long ll;
int read() {int x = 0, f = 1, ch = getchar();while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();return x * f;
}int n, t[maxn][26], fail[maxn], num[maxn], tot = 0;
char s[maxn];
void add() {//建立trie树register int len = strlen(s), p = 0;for(int i = 0; i < len; i++) {int u = s[i] - 'a';if(!t[p][u]) t[p][u] = ++tot; p = t[p][u];}num[p]++;//表示以p结尾的字符串数
}queue q;
void build() {for(int i = 0; i < 26; i++) if(t[0][i]) q.push(t[0][i]);//bfs建立fail指针while(q.size()) {register int u = q.front(); q.pop();for(int i = 0, v; i < 26; i++) {v = t[u][i];if(v) fail[v] = t[fail[u]][i], q.push(v);//如果有儿子,就匹配过去else t[u][i] = t[fail[u]][i];//没有的话相当于路径压缩,直接连过去}}
}int ans = 0;
void AC() {register int len = strlen(s), p = 0;for(int i = 0, u, v; i < len; i++) {u = s[i] - 'a';  p = t[p][u], v = p;while(v && num[v] != -1) {//暴力跳fail查询ans += num[v], num[v] = -1;v = fail[v];}}
}signed main() {n = read();for(int i = 1; i <= n; i++) scanf("%s", s), add();build(); scanf("%s", s); AC();printf("%d\n" , ans);return 0;
}

(未完待续 咕太久了我也忘了后续要写啥QAQ

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...