AC自动机自我理解和模板
给出长度为m的文本
查询 n个单词出现的次数
用kmp 复杂度 n*m*(单词平均长度)
用字典树 复杂度 m*每次字典树遍历的平均深度)
AC自动机 复杂度 m (思路可以理解为kmp+字典树 )
正在学 代码没修改完
#include<bits/stdc++.h> using namespace std; ; ; struct node { node *fail; node *next[kind]; int cnt; node() { fail=NULL; cnt=; memset(next,NULL,sizeof(next)); } }*q[maxn]; ]; ]; //模式串 int head,tail; //队列的头尾指针 void insert(char *str,node *root) // **************建树 { node *p=root; ,index; while(str[i]) { index=str[i]-'a'; if(p->next[index]==NULL) p->next[index]=new node(); p=p->next[index]; i++; }p->cnt++; } void build_ac_automation(node *root) { root->fail=NULL; q[head++]=root;// tou zhi zheng while(head!=tail) { node *temp=q[tail++]; node *p=NULL; ;i<;i++) { if(temp->next[i]!=NULL) { if(temp==root) temp->next[i]->fail=root; else { p=temp->fail; while(p!=NULL) { if(p->next[i]!=NULL) { temp->next[i]->fail=p->next[i]; break; } p=p->fail; } if(p==NULL) temp->next[i]->fail=root; } q[head++]=temp->next[i]; } } } } int ac_query(node *root) { ; ; int index; int l=strlen(str); node *p=root; while(str[i]) { index=str[i]-'a'; index=str[i]-'a'; while(p->next[index]==NULL && p!=root) p=p->fail; p=p->next[index]; p=(p==NULL)?root:p; node *temp=p; ) { num+=temp->cnt; temp->cnt=-; temp=temp->fail; } i++; } return num; } int32_t main() { }
banzi https://www.cnblogs.com/MingSD/p/8733762.html
#include<bits/stdc++.h> using namespace std; #define LL long long #define ULL unsigned LL #define fi first #define se second #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define max3(a,b,c) max(a,max(b,c)) #define min3(a,b,c) min(a,min(b,c)) const int INF = 0x3f3f3f3f; ; typedef pair<int,int> pll; , M = 1e3; ]; ][]; ]; ]; ; void Insert(){ , len = strlen(str); ; i < len; i++){ int id = str[i] - 'a'; ){ cnt[tot] = ; fair[tot] = ; trie[rt][id] = tot++; } rt = trie[rt][id]; } cnt[rt]++; } void Build_tree(){ queue<int> q; q.push(); int p; while(!q.empty()){ int tmp = q.front(); q.pop(); ; i < ; i++){ ){ ) fair[trie[tmp][i]] = ; else{ p = fair[tmp]; while(p){ if(trie[p][i]){ fair[trie[tmp][i]] = trie[p][i]; break; } else p = fair[p]; } ; } q.push(trie[tmp][i]); } } } } int Query(){ , ret = , len = strlen(str); ; i < len; i++){ int id = str[i] - 'a'; ) rt = fair[rt]; rt = trie[rt][id]; ) rt = ; int tmp = rt; ){ ){ ret += cnt[tmp]; cnt[tmp] = -; } else break; tmp = fair[tmp]; } } return ret; } void init(){ ; i < tot; i++){ ; j < ; j++) trie[i][j] = ; } tot = ; } int main(){ int T; scanf("%d", &T); while(T--) { init(); int n; scanf("%d", &n); while(n--) { scanf("%s", str); Insert(); } Build_tree(); scanf("%s", str); printf("%d\n", Query()); } ; }
AC自动机自我理解和模板的更多相关文章
- AC自动机详解 (P3808 模板)
AC自动机笔记 0.0 前言 哇,好久之前就看了 KMP 和 Trie 树,但是似乎一直没看懂 AC自动机?? 今天灵光一闪,加上之前看到一些博客和视频,瞬间秒懂啊... 其实这个玩意还是蛮好理解的. ...
- HDOJ-2222(AC自动机+求有多少个模板串出现在文本串中)
Keywords Search HDOJ-2222 本文是AC自动机的模板题,主要是利用自动机求有多少个模板出现在文本串中 由于有多组输入,所以每组开始的时候需要正确的初始化,为了不出错 由于题目的要 ...
- KMP算法自我理解 和 模板
字符串 abcd abc abcd abc 匹配串 cdabcd 匹配串的 next 0 0 0 0 1 2: 开始匹配 abcd abc abcd abc cd abc d a,d 匹配失 ...
- 【AC自动机】HDU中模板题
[HDU2222] 最纯粹的裸题,错误点详见注释. #include<iostream> #include<cstdio> #include<cstring> #i ...
- ac自动机(tree+kmp模板)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- HDU 2222 AC自动机模板题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...
- 【题解】P3796【模板】AC自动机(加强版)
[题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我 ...
- AC自动机--summer-work之我连模板题都做不出
这章对现在的我来说有点难,要是不写点东西,三天后怕是就一无所有了. 但写这个没有营养的blog的目的真的不是做题或提升,只是学习学习代码和理解一些概念. 现在对AC自动机的理解还十分浅薄,这里先贴上目 ...
- 洛谷--P3808 【模板】AC自动机(“假的“简单版)
如果你想要做出这道题,你需要先了解两个知识点: 1.字典树的构造 2.KMP算法(也就是fail指针的构造) 对于字典树,可以看看这个大佬: https://www.cnblogs.com/TheRo ...
随机推荐
- java 一些容易忽视的小点-类和对象
构造器 通过new关键字调用 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能在构造器里使用return返回某个值. 构造器是有权限的,也就是可以添加public,也可以添加 ...
- POJ 1936 All in All 匹配, 水题 难度:0
题目 http://poj.org/problem?id=1936 题意 多组数据,每组数据有两个字符串A,B,求A是否是B的子串.(注意是子串,也就是不必在B中连续) 思路 设置计数器cnt为当前已 ...
- centos7 克隆 网卡无法启用
1.克隆后查看网卡无法启用,报错信息如下: Apr :: agent systemd: network.service: control process exited, code=exited sta ...
- 对象关系_many2many
jdbc: package demo.test.many2many; import java.util.HashSet; import java.util.Set; public class Stud ...
- Spring Boot + Druid 监控数据库(三)
Druid可以做什么? 1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助. 2) 替换DBC ...
- vue组件的使用和事件传递
子组件与父组件的事件传递具体实现如下: 子组件: <template> <section class="xftz-data-list"> <div c ...
- 软件设计基础-C/S系统
在软件设计开发过程中,逐渐形成了一些针对特定应用领域的软件系统组织方式的惯用模式 如经典的C/S(client/server,客户/服务器)模式和B/S(browser/server,浏览器/服务器) ...
- Edit Distance II
Given two strings S and T, determine if they are both one edit distance apart. Example Given s = &qu ...
- page指令import属性实例
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(三)
MyEclipse限时秒杀!活动火热开启中>> [MyEclipse最新版下载] 三.配置XDoclet支持的项目 默认情况下,MyEclipse EJB项目未配置使用XDoclet功能. ...