关于Trie KMP AC自动机
个人认为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自动机的更多相关文章
- Trie树&kmp&AC自动机&后缀数组&Manacher
Trie 计数+Trie,读清题意很重要 https://vjudge.net/problem/UVALive-5913 kmp AC自动机 模板:https://vjudge.net/problem ...
- 字符串的模板 Manacher kmp ac自动机 后缀数组 后缀自动机
为何scanf("%s", str)不需要&运算 经常忘掉的字符串知识点,最好不加&,不加&最标准,指针如果像scanf里一样加&是错的,大概是未定 ...
- 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 ...
- 2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机)
2021.11.09 P2292 [HNOI2004]L语言(trie树+AC自动机) https://www.luogu.com.cn/problem/P2292 题意: 标点符号的出现晚于文字的出 ...
- hdu1686 Oulipo KMP/AC自动机
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- 1036 : Trie图 (AC自动机)
题目大意: 输入 n 个目标单词和一个文本串,判断文本串中是否存在某些目标单词. 思路 赤裸裸的 AC自动机. 代码: #include<iostream> #include<cst ...
- BZOJ 3530 [SDOI2014]数数 (Trie图/AC自动机+数位DP)
题目大意:略 裸的AC自动机+数位DP吧... 定义f[i][x][0/1]表示已经匹配到了第i位,当前位置是x,0表示没到上限,1到上限,此时数是数量 然而会出现虚拟前导零,即前几位没有数字的情况, ...
- 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 ...
随机推荐
- OpenLayers.Map的一些特殊事件
开年上班的第二天,无意中看到一些没见过的事件,特地来给广大人民群众报个信. 众所周知的,map里面的 eventListeners 支持的事件挺多的,比如: var map = new OpenLay ...
- [No0000B7]If else 与 三元表达式? : 效率对比
先看 if else 一段代码 using System; class Program { private static void Main() { ; ) i = -; ; Console.Writ ...
- [转载]【虚拟化系列】VMware vSphere 5.1 虚拟机管理
转载自:http://mabofeng.blog.51cto.com/2661587/1019497 在上一博文中我们安装了强大的VMware vCenter管理中心,通过VMware vSphere ...
- 第七届蓝桥杯javaB组真题解析-生日蜡烛(第二题)
题目 /* 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...
- JAVA函数的重载
一.什么是重载(overlording) 在JAVA中,可以在同一个类中存在多个函数,函数名称相同但参数列表不同.这就是函数的重载(overlording).这是类的多太性表现之一. 二.重载的特征: ...
- spring入门--Spring框架底层原理
上一篇的博客,我们可以看出来,spring可以维护各个bean (对象),并向其中注入属性值.那么,如果们要把一个对象的引用注入另外一个对象呢?应该怎么处理呢? 我们知道,对于对象中的属性来说,我们注 ...
- ASP.NET连接数据库配置文件
// Web.Config <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配置 ASP.NE ...
- margin:0 auto;不居中?
1.没有设置宽度 <div style="margin:0 auto;"></div> 看看上面的代码,根本没有设置DIV的宽度,如何根据宽度自适应呢?新手 ...
- AOP的简单练习
---恢复内容开始--- 1.AOP的主要作用及概念简介 AOP最大的用处在于事务处理上,业务层在项目中主要负责以下的操作: ·调用数据层进行处理: ·进行事务的处理: ·关闭数据库的连接操作: 但在 ...
- 【CNMP系列】CNMP之路,系统起步。
简单的来理解,我所说的CNMP,不是CNM+P,而是CentOs+Nginx+MySql+PHP,也可以单纯的理解为LNMP,但是系统是我们自己选的,虽说是Linux的一个分支,但我就喜欢CentOs ...