博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AC自动机(转载)
阅读量:4922 次
发布时间:2019-06-11

本文共 1397 字,大约阅读时间需要 4 分钟。

本来以为是很高级的算法 其实理解以后并不难 只是在字典树的基础上用fail数组标记一下回朔的位置 加速查找 就可以实现多模式串的匹配查找

模版如下:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long intusing namespace std;inline ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}inline ll lcm(ll a,ll b){ return a/gcd(a,b)*b;}int moth[13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31};int dir[4][2]={ 1,0 ,0,1 ,-1,0 ,0,-1};int dirs[8][2]={ 1,0 ,0,1 ,-1,0 ,0,-1, -1,-1 ,-1,1 ,1,-1 ,1,1};const int inf=0x3f3f3f3f;const ll mod=1e9+7;struct Trie{ int trie[500007][26],fail[500007],cntword[500007]; int sz,root; int newnode(){ for(int i=0;i<26;i++) trie[sz][i]=-1; cntword[sz++]=0; return sz-1; } void init(){ //初始化 sz=0; root=newnode(); } void insert(string s){ // 构建字典树 int len=s.length(); int now=root; for(int i=0;i
q; fail[root]=root; for(int i=0;i<26;i++){ if(trie[root][i]==-1) trie[root][i]=root; else{ fail[trie[root][i]]=root; q.push(trie[root][i]); } } while(!q.empty()){ int now=q.front(); q.pop(); for(int i=0;i<26;i++){ if(trie[now][i]==-1) trie[now][i]=trie[fail[now]][i]; else{ fail[trie[now][i]]=trie[fail[now]][i]; q.push(trie[now][i]); } } } } int query(string s){ //查询操作 int len=s.length(); int now=root; int res=0; for(int i=0;i

 

转载于:https://www.cnblogs.com/wmj6/p/10828148.html

你可能感兴趣的文章
Android的minSdkVersion,targetSdkVersion,maxSdkVersion
查看>>
Xceed WinForm数据表格控件Xceed Grid For .NET控件详细介绍及下载地址
查看>>
linux 下连接mysql服务器
查看>>
Linux常用网络命令整理
查看>>
C++ 面向对象
查看>>
Maven Nexus
查看>>
js 判断滚动条的滚动方向
查看>>
css,js文件后面加一个版本号
查看>>
webpack第一节(2)
查看>>
python之asyncio三种应用方法
查看>>
转:[Server] 在 Windows 上安裝 PHP 5.3 開發環境
查看>>
【IE6的疯狂之二】IE6中PNG Alpha透明(全集)
查看>>
第一个Shell脚本
查看>>
C++ 小笔记
查看>>
Mysql 语句优化
查看>>
例子:进度条
查看>>
包含单引号的sql
查看>>
HTML 基础 2
查看>>
Java 最常见 200+ 面试题全解析:面试必备(转载)
查看>>
LinkedList
查看>>