个人认为trie,KMP,AC自动机是思想非常明确的,AC自动机的性质是与KMP算法的思想类似的(失配后跳转)

而KMP是线性的,AC自动机是在tire树上跑KMP,为方便那些不会用指针的小朋友(我也不会。。。。)

我的tire树,kmp算法的next,AC自动机的fail全是用数组实现的!!!!(还有谁???!!!)

所以

上板子

1.KMP

2.TRIE

3.AC自动机

void make() {
nxt[1]=0;
for(int i=2; i<=len1; i++) {
int j=nxt[i-1];
while(j>0 && s[i]!=s[j+1])j=nxt[j];
if(s[i]==s[j+1])nxt[i]=j+1;
else nxt[i]=0;
}
return;
}
void kmp(int len){
int j=0;
for(int i=1;i<=len1;++i){
while(j&&s[j+1]!=s[i])j=nxt[j];
if(s[j+1]==s[i])j++;
if(j>=len)tot++,j=nxt[j];
}
}
struct data {
int num[28];
int cnt;
} node[1000001];
char s[100000];
void build(char*str) {
int now=0;
while(*str) {
int k=int(*str-'a');
if(!node[now].num[k])Au++,node[now].num[k]=Au;
now=node[now].num[k],node[now].cnt++;
str++;
}
}
void print(char*str) {
int now=0;
while(*str) {
int k=int(*str-'a');
if(!node[now].num[k]) {
printf("0\n");
return;
}
now=node[now].num[k];
str++;
}
}
struct data{
int num[27],id;
}trie[10001];
queue<int>bfs;
int fail[10001];
int n,tot,len;
int ans[10001];
char s[10001][51];
char t[10000001];
void add(int q){//建一棵神奇的字典树
int now=0;
int head=0;
while(head!=len){
int k=int(s[q][head]-'a');
if(!trie[now].num[k])trie[now].num[k]=++tot;
now=trie[now].num[k];
if(head==len-1){trie[now].id=q;break;}
head++;
}
}
void bbfs(){
bfs.push(0);
while(!bfs.empty()){
int w=bfs.front();
for(int i=0;i<=25;++i)if(trie[w].num[i]){//若有
int u=trie[w].num[i];
int fa=fail[w];
while((fa)&&(trie[fa].num[i]==0))fa=fail[fa];//如果父亲的fail无其相应字母子节点,一直跳下去直到根节点
if((trie[fa].num[i]!=u)&&(trie[fa].num[i]))//不等于本身
fail[u]=trie[fa].num[i];
bfs.push(u);//入队
}
bfs.pop();//队首元素出队
}
}
void make(){
int now=0;
for(int i=0;i<len;++i){
int k=int(t[i]-'a');
while(!trie[now].num[k]&&now!=0)now=fail[now];
now=trie[now].num[k];
int KMP=now;//根据fail数组性质,要一直while下去!!!直至根节点
while(KMP)ans[trie[KMP].id]++,KMP=fail[KMP];
}
}

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

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

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

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

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

  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. 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)

    2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...

  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. 1036 : Trie图 (AC自动机)

    题目大意: 输入 n 个目标单词和一个文本串,判断文本串中是否存在某些目标单词. 思路 赤裸裸的 AC自动机. 代码: #include<iostream> #include<cst ...

  8. BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)

    题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...

  9. KMP & AC自动机

    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(i ...

随机推荐

  1. 源码(06) -- java.util.AbstractList<E>

    java.util.AbstractList<E> 源码分析(JDK1.7) ------------------------------------------------------- ...

  2. QQ18年,解密8亿月活的QQ后台服务接口隔离技术

    作者:shane,腾讯后台开发高级工程师 QQ18年 1999年2月10日,腾讯QQ横空出世.光阴荏苒,那个在你屏幕右下角频频闪动的企鹅已经度过了18个年头.随着QQ一同成长的你,还记得它最初的摸样吗 ...

  3. 为什么亚马逊云计算中的DNS服务叫Route53?

    最近在用亚马逊的云计算服务,看到它的DNS服务的名字叫做"Route 53".这个名字让我很好奇,为什么叫"Route 53"呢?有什么特殊含义? 看到了这个Q ...

  4. 如何创建DLL文件

    动态链接库(DLL)是从C语言函数库和Pascal库单元的概念发展而来的.所有的C语言标准库函数都存放在某一函数库中.在链接应用程序的过程中,链接器从库文件中拷贝程序调用的函数代码,并把这些函数代码添 ...

  5. centos安装UCenter 和 UCenter_Home

    1.搭建lamp环境yum  –y  install  httpd  php  php-mysql  mysql  mysql-server 2启动服务   3.设置服务开机自动启动 4.上传UCEN ...

  6. load & get 加载方式

    1.Hibernate中get和load有什么不同之处? (1)Hibernate的get方法,会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数 ...

  7. iOS arc下控制某一文件为非arc

    选中文件加上编译参数 -fno-objc-arc即可.

  8. springmvc 获取request 和 java路径分隔符 在windows 和linux 下自动判断的方法

    //获取requert HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestA ...

  9. Hibernate框架双向多对多关联映射关系

    建立双向多对多关联关系    Project.java (项目表)                private Integer proid;                private Strin ...

  10. 项目架构开发:数据访问层之UnitOfWork

    接上文 项目架构开发:数据访问层之IQuery 本章我们继续IUnitOfWork的开发,从之前的IRepository接口中就可以看出,我们并没有处理单元事务, 数据CUD每次都是立即执行的,这样有 ...