关于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 ...
随机推荐
- Iris的R语言命令工具箱(1)
Iris的R语言命令工具箱(1) 最近在做数据分析,使用了R语言做了些数据处理和可视化,在此记下遇到过的问题.应用过的命令.处理方式以及工具包- *版权声明:本文为博主原创文章,转载请注明本文地址.h ...
- Python - Python2与Python3合理共存Windows平台
Install Python2 and Python3 Python 2.7.13 - Windows x86-64 MSI installer Python 3.6.0 - Windows x86- ...
- Linux驱动技术(七) _内核定时器与延迟工作
内核定时器 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行.实际上,时钟中断处理程 ...
- Hbase数据库安装
一.环境准备 1.Ubuntu14.04-server 2.ssh 3.jdk1.6 4.hbase-0.98.19-hadoop2-bin.tar.gz(下载地址http://www.apache. ...
- 小机器人自动回复(python,可扩展开发微信公众号的小机器人)
api来之图灵机器人.我们都知道微信公众号可以有自动回复,我们先用python脚本编写一个简单的自动回复的脚本,利用图灵机器人的api. http://www.tuling123.com/help/h ...
- EF操作扩展之async
EF的操作类网上很多类,我只是把我在平时项目中的类进行一些改进和扩展,扩展了部分同步和异步的EF操作 接口 /// <summary> /// 接口数据操作基础类 /// </sum ...
- ubuntu下包管理器apt-get常用命令
apt-cache search package 搜索包 apt-cache show package 获取包的相关信息,如说明.大小.版本等 sudo apt-get install package ...
- Redis 学习之持久化机制、发布订阅、虚拟内存
一.持久化机制 Redis是一个支持持久化的内存数据库,redis会经常将内存中的数据同步到硬盘上来保证数据持久化,从而避免服务器宕机数据丢失问题,或者减少服务器内存消耗提高性能. 持久化方式: 1. ...
- HTML学习二
继续上一次的学习: <html> <head> <title>新增雇员</title> <script language="javasc ...
- WP8.1应用双击返回键退出程序。
#region 双击退出程序代码 //双击HardwareButtons.BackPressed: //出现退出提示窗口: //“确定”退出,“取消”返回什么也不做: private async vo ...