【AC自动机】【数据结构】【树】【Aho-Corasick automation】AC自动机理解(入门)...

引入

我们首先提出一个问题:
给出n个串每个串的长度m
然后给出一个长度为k的串,询问前n个串中有多少个是匹配成了的

暴力搜索

这题不是sb题目吗?
随随便便O(kmn)跑过。
。。。。
n=10000 m=50
k=1000000
。。。。
好吧——我们用AC自动机吧

样例

首先我们举一个例子,我们有n=3个串he 和 her 和 she
然后我们通过构建Trie可以得到下图
这里写图片描述
这里红色的节点到根的路径可以构成一个串(怎么那么像后缀自动机?)然后我们可以发现

正文

概念

我们使用Fail(i)表示i节点用虚线连接的边,这样的边我们的作用就是当前节点到根的路径构成的字符串的最长的存在的后缀的串的位置。比如she 和 he 中 he 就是 she 的最长的后缀所以我们连接 e2->e这样我们假设从e2无法再继续伸展的时候我们就可以O(1)找到类似的串,然后继续进行伸展得到如下的图
这里写图片描述
这样比如我们匹配sher的时候我们首先沿着边走到e2然后不需要重新搜索,而是选择立即跳转到e节点然后搜索到r节点

这样我们就构造出了一个AC自动机的图

构建方法

就使用上面的例子
这里写图片描述
对于这样的一个图,我们首先队列中有

Queue01
hs

同时将深度为1的节点连接Fail到root
这里写图片描述
然后我们扫描一遍h节点可以得到e节点然后我们扫描s节点可以发现s的Fail边上的root节点存在和s的儿子h相同的另一个h那么因为s的fail边上的所有节点的后缀相同,所以我们有h2和h节点同时增加一个节点后仍然满足上面的Fail边的概念,所以我们h2->h得到
这里写图片描述
同时我们的队列变成了

Queue01
2h2

对于下面的伸展我们可以得到(同理):
这里写图片描述
呵呵呵代码时间:

代码

void Insert(char *s){int len = strlen(s), u = root;for(int i=0;i<len;i++){int id = idx(s[i]);if(!pool[u].ch[id]) pool[u].ch[id] = ++ecnt;u = pool[u].ch[id];}pool[u].End_Flag++;
}
void build(){queue<int> que;for(int i=0;i<26;i++)if(pool[root].ch[i])que.push(pool[root].ch[i]);int u, v, t, p;while(!que.empty()){u = que.front();que.pop();for(int i=0;i<MAXK;i++) if(pool[u].ch[i]){v = pool[u].ch[i];que.push(v);p = pool[u].Fail;while(p && !pool[p].ch[i]) p = pool[p].Fail;t = pool[p].ch[i];pool[v].Fail = t;pool[v].last = pool[t].End_Flag ? t : pool[t].last;}}
}

感谢

感谢您阅读这篇文章,如果有不足的地方请做出评论谢谢

转载于:https://www.cnblogs.com/JeremyGJY/p/5921588.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

域控dns无法解析域控_域注册商,DNS和托管

域控dns无法解析域控by ᴋɪʀʙʏ ᴋᴏʜʟᴍᴏʀɢᴇɴ由ᴋɪʀʙʏᴋᴏʜʟᴍᴏʀɢᴇɴ 域名注册商&#xff0c;DNS和托管 (Domain registrars, DNS, and hosting) 如何正确设置网站 (How to set up your website the right way) It took me a while to set up the infras…

java 栈空间_初学JAVA——栈空间堆空间的理解

1.Person pangzi; //这是在“开拓空间”于栈空间pangzinew Person(); //这是赋值于堆空间上两步就是在做与空间对应的事。2.值类型直接存入栈空间&#xff0c;如AF&#xff0c;引用类型存入堆空间&#xff0c;在栈空间存有“索引地址”&#xff0c;如当需要B时&#xff0…

二进制安装kubernetes v1.11.2 (第八章 kube-apiserver 部署)

继续上一章部署。 八、部署kube-apiserver组件 使用第七章的haproxy和keepalived部署的高可用集群提供的VIP&#xff1a;${MASTER_VIP} 8.1 下载二进制文件&#xff0c;参考 第三章  8.2 创建 kubernetes 证书和私钥 source /opt/k8s/bin/environment.sh cat > kubernetes-…

element手机验证格式_vue封装 element-ui form表单验证 正则匹配手机号 自定义校验表格内容...

效果image.png在methods中//检查手机号isCellPhone(val) {if (!/^1(3|4|5|6|7|8)\d{9}$/.test(val)) {return false;} else {return true;}}在template中v-model"forgetForm.phone"type"text"auto-complete"off"placeholder"请输入你的手机…

multi-mechanize error: can not find test script: v_user.py问题

从github上下载&#xff0c;安装multi-mechanize&#xff0c;新建工程&#xff0c;运行工程报错。 环境&#xff1a; win7-x64, python 2.7 multi-mechanize can not find test script: v_user.py 查看了github上的工程&#xff0c;项目无人维护&#xff0c;这个问题2016年11月…

@RequestMapping 用法详解之地址映射

引言&#xff1a; 前段时间项目中用到了RESTful模式来开发程序&#xff0c;但是当用POST、PUT模式提交数据时&#xff0c;发现服务器端接受不到提交的数据&#xff08;服务器端参数绑定 没有加任何注解&#xff09;&#xff0c;查看了提交方式为application/json&#xff0c; 而…

我的第一个网页 代码_我在免费代码营的第一个月

我的第一个网页 代码by Elliott McNary埃利奥特麦克纳里(Elliott McNary) 我在免费代码营的第一个月 (My First Month At Free Code Camp) I wanted to build an app that would help artists to make more money.我想开发一个可以帮助艺术家赚更多钱的应用。 I had a clear …

java pem rsa_如何从java中的pfx文件/ pem文件中获取RSA公钥的指数和模数值

I want to extract information about RSA Public Key from the pfx file using java.我有一个pfx文件并转换为x509 Pem文件 . 从pem文件&#xff0c;在终端中使用以下命令&#xff1a;openssl x509 -in file.pem -text我能够查看公钥指数和模数值主题公钥信息&#xff1a;Publ…

jmeter+maven+jenkins自动化接口测试(下)

mavenjmeter已经写好了&#xff0c;可以通过maven来执行jmeter的接口测试脚本&#xff0c;怎样实现定时执行测试并发送报告邮件就需要通过jenkins了&#xff08;jmeter或者testng也可以结合不同的邮件jar包来发送邮件&#xff0c;这里使用jenkins&#xff09; 安装jenkins笔记有…

在使用angularjs过程,ng-repeat中track by的作用

转载&#xff1a;http://segmentfault.com/q/1010000000405730<div ng-repeat"links in slides"> <div ng-repeat"link in links track by $index">link.name</div></div>Error: [ngRepeat:dupes]这个出错提示具体到题主的情况…

java判断读到末尾_IO流如何判断读取到了流的结尾,程序中以-1来判断,是流中写入一个EOF表示流结束吗,底层实现呢?...

-1不是流中写入的数据。read()方法返回的数据都是unsigned byte&#xff0c;即是[0,255]。底层实现有很多&#xff0c;比如socket IO和文件IO&#xff0c;甚至你自己也可以实现。——————————————————————给两个类的代码给你看看&#xff0c;理解一下这个东…

结束书

by William Countiss威廉Countiss 结束书 (Closing the Book on Closures) JavaScript closures are an important, but notoriously confusing concept. There’s no escaping it — if you want to grow as a developer, you need to understand what closures are and how …

java激励_激励干个人java的不足之处

1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF&#xff0c;J2EEDP)以及综合模式。你应该十分了解UML&#xff0c;尤其是class&#xff0c;object&#xff0c;interaction以及statediagrams。2.你需要学习JAVA语言的基础知识以及它的核心类库(collections&#xff0c;…

Bioconductor软件安装与升级

1 安装工具Bioc的软件包不能使用直接install.packages函数&#xff0c;它有自己的安装工具&#xff0c;使用下面的代码&#xff1a; source("https://bioconductor.org/biocLite.R")biocLite() 上面第二个语句将安装Bioconductor一些基础软件包&#xff0c;包括BiocI…

Laravel Kernel引导流程分析

Laravel Kernel引导流程分析 代码展示 protected function sendRequestThroughRouter($request) {# $this->app->instance(request, $request);# Facade::clearResolvedInstance(request);// 主要是这句代码$this->bootstrap();# return (new Pipeline($this->app)…

Android RecyclerView (一) 使用完全解析

转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/45059587&#xff1b; 本文出自:【张鸿洋的博客】 概述 RecyclerView出现已经有一段时间了&#xff0c;相信大家肯定不陌生了&#xff0c;大家可以通过导入support-v7对其进行使用。 据官方的…

数据透视表日期怎么选范围_透视范围

数据透视表日期怎么选范围by Tiffany White蒂芙尼怀特(Tiffany White) 透视范围 (Putting Scope in Perspective) In JavaScript, lexical scope deals with where your variables are defined, and how they will be accessible — or not accessible — to the rest of your…

feign调用多个服务_Spring Cloud 快速入门系列之feign–微服务之间的调用

我们将一个大的应用拆成多个小的服务之后&#xff0c;紧接着的一个问题就是&#xff0c;原本都在一个项目里&#xff0c;方法我可以随便调用&#xff0c;但是拆开后&#xff0c;原来的方法就没法直接调用了&#xff0c;这时候要怎么办&#xff1f;Spring Cloud提供了feign&…

Asix下日志包冲突

为什么80%的码农都做不了架构师&#xff1f;>>> Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging. 最近集成asix包的时候发生如下错误&#xff0c;原因是程序运行时logFactoryImple加载了JBOSS下面的sff4j包…

kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础&#xff1a;1. 已安装、配置kubernetes2. 集群中有tomcat与mysql容器镜像3. 有docker基础具体步骤部署tomcat创建tomcat RC对象我们想要在kubernetes集群中配置tomcat服务器&#xff0c;首先要保证集群中的节点上…