关于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 ...
随机推荐
- 如何给 UILable 添加横线
类似淘宝上的原价现价,原价上一般都会有一条横线,这种效果怎么实现呢?其实相当的简单,我们只需要重写自定义的lable的 - (void)drawRect:(CGRect)rect 方法就行了. 具体实 ...
- ubuntu14.04 下手动安装java jdk
ubuntu14.04 下手动安装java jdk 第一步: 下载jdk.tar.gz (这里假设下载的文件名为jdk.tar.gz) 第二步: 解压 sudo tar -zxvf ./jdk.tar ...
- 浅谈Django的Q查询以及AngularJS的Datatables分页插件
使用Q查询,首先要导入Q模块: from django.db.models import Q 可以组合使用&,|操作符用于多个Q的对象,产生一个新的Q对象,Q对象也可以用~操作符放在前面表示否 ...
- Madifest文件详解
介绍 Madifest是个XML的描述文件,对于每个DLL有DLL的Manifest文件,对于每个应用程序Application也有自己的Manifest.对于应用程序而言,Manifest可以是一个 ...
- 如何用CSS进行网页布局---学习总结
页面布局:对页面的文字.图形或表格进行格式设置.包括字体.字号.颜色纸张大小和方向以及页边距等 页面布局分为4种: 一栏布局 两栏布局 三栏布局 混合布局 灵活利用float.position对页面进 ...
- 列存储段消除(ColumnStore Segment Elimination)
列存储索引是好的!对于数据仓库和报表工作量,它们是真正的性能加速器.与聚集列存储结合,你会在常规行存储索引(聚集索引,非聚集索引)上获得巨大的压缩好处.而且创建聚集列存储索引非常简单: CREATE ...
- 关于data-xxx属性大小写不敏感,不识别大写的几点总结
1.所有标签属性,没有大小写区分,都是小写,如:data-userID,在输出后会变成data-userid,前者只能获取到'undefined'. 2.dataset 自动把 - 转换为驼峰.类似的 ...
- 重新学习WCF
近来工作不怎么忙,一直在想一个问题,今年刚刚毕业,对于我们这应届生到底应该学习那些技术呢? 面对着现在技术横生,到底哪项是适合自己的呢?自己一直都在迷茫,若有那位大神再次经过,望给出您宝贵的建议. 最 ...
- java-9 异常处理
1.异常处理的基础知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如 ...
- wordPress查看站点时,显示文件目录
1.在wordpress的代码目录中增加.htaccess文件. 2.在.htaccess文件中加入如下内容: DirectoryIndex index.php index.html# BEGIN W ...