学习后缀自动机想法

小序:学习后缀自动机是要有耐心的,clj的论文自己看真心酸爽!(还是自己太弱,ls,oyzx好劲啊,狂膜不止)

   刚刚在写博客之前又看了篇论文,终于看懂了,好开心

正文:

  一.后缀自动机是什么?

   答:后缀树+自动机

  二.能处理什么问题?

   答:字符串之类的啊,还要问

  三.有什么优点?

   答:代码短,时间复杂度低

  四.怎么写?

   1.首先你得知道什么是自动机和什么是后缀树?

    这个是基础问题,你可以去查查资料,本文不再阐述。

   2.后缀树建树点是N2的,怎么破?

    clj的ppt写的很详细,但是不是很容易懂,于是我这个蒟蒻就讲讲吧。

    (1).我们要破点又要能表示所有的状态势必就要合并点。

       可是什么样的点是可以合并?

       这可谓是后缀自动机学习需要了解的关键之一,下面我就讲一下我的想法:

       我们首先要定义一个right数组,表示一个子串s在母串ss中的右端点位置集合,例如aab在aabaabab中的right[s]={3,6};

       这个有什么用呢?

       我们来想一个这样的问题如果两个串s1,s2的right集合有交集那会是什么情况?

       先给出结论等下在证明:设sum[right[s]]代表right[s]集合的元素个数,如果两个串s1,s2的right集合有交集,并且sum[s1]>=sum[s2]则s1是s2的子串;

       证明:设right[s1]∩right[s2]={v1,v2,v3.....,vk},就那v1来看吧,那么s1和s2势必是v1前面的某两个点到v1所形成的字符串,那么为什么sum[s1]>=sum[s2]则是s1是s2的子串?一个显然的结论:如果一个子串的sum更大,那么它的长度越短。

       证明了这些东西,那么right集合相等的就可以合并了啊,是不是很神,然后我们就可以利用right集合建一颗树了(可以表示出一个串的从属情况)

       如下图:

               

       这样就可以了吗,能表示所有的子串状态吗?显然是不行的,不然要自动机干嘛(可以自己yy一下)。

    (2).状态数的线性证明.

       clj的ppt非常详细,自己看看吧,我怕我自己的证明不严谨将读者带入歧路。

    (3).构造过程:

       设:已匹配串s,待匹配字符x,已建节点p。

       1.新建节点np,然后从p开始向fa[p]跳,如果有连出为x的边并且val[p]+1=val[son[p][x]]则向np连一条为x的边。否则执行步骤2.

       2.

        

      3.到这里你可能就要大喊一句为什么?为什么要新建节点?

       

            

      论文上写很好,你们如果不理解可以留言问我咯【本蒟蒻QQ:1481632287】

   五.总结:这个东西学起来有点难懂,但是学完了会发现还是很简单的,虽说可能它的用处比后缀数组要小但是它的代码短,又高效这才是更适合oi比赛的东东。

    刚刚发现一个好强的博客:http://blog.csdn.net/wangzhen_yu/article/details/45481269;

    

       

    

   

   

 

转载于:https://www.cnblogs.com/HQHQ/p/5547694.html

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

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

相关文章

mysql 分组top_MySQL:如何查询出每个分组中的 top n 条记录?

问题描述需求:查询出每月 order_amount(订单金额) 排行前3的记录。例如对于2019-02,查询结果中就应该是这3条:解决方法MySQL 5.7 和 MySQL 8.0 有不同的处理方法。1. MySQL 5.7我们先写一个查询语句。根据 order_date 中的年、月,…

利用jenkins的api来完成相关工作流程的自动化

[本文出自天外归云的博客园] 背景 1. 实际工作中涉及到安卓客户端方面的测试,外推或运营部门经常会有很多的渠道,而每个渠道都对应着一个app的下载包,这些渠道都记录在安卓项目下的一个渠道列表文件中。外推或运营部门经常会有新的渠道产生&a…

拥有成本分析:Oracle WebLogic Server与JBoss

Crimson Consulting Group 撰写的非常有趣的白皮书 ,比较了Weblogic和JBoss之间的拥有成本 。 尽管JBoss是免费的,但该白皮书却严肃地宣称,从长远来看,Weblogic更便宜。 尽管此研究是由Oracle赞助的,但它看起来非常严肃…

mysql limit 分页 0_Mysql分页之limit用法与limit优化

Mysql limit分页语句用法与Oracle和MS SqlServer相比,mysql的分页方法简单的让人想哭。--语法:SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset--举例:select * from table limit 5; --返回前5行select * from table limit 0…

linux每天一小步---sed命令详解

1 命令功能 sed是一个相当强大的文件处理编辑工具,sed用来替换,删除,更新文件中的内容。sed以文本行为单位进行处理,一次处理一行内容。首先sed吧当前处理的行存储在临时的缓冲区中(称为模式空间pattern space&#xf…

mysql trace工具_100% 展示 MySQL 语句执行的神器-Optimizer Trace

在上一篇文章《用Explain 命令分析 MySQL 的 SQL 执行》中,我们讲解了 Explain 命令的详细使用。但是它只能展示 SQL 语句的执行计划,无法展示为什么一些其他的执行计划未被选择,比如说明明有索引,但是为什么查询时未使用索引等。…

006_过滤器

过滤器 过滤器(Filter)把附加逻辑注入到MVC框的请求处理,实现了交叉关注。所谓交叉关注(Cross-Cutting Concerns),是指可以用于整个应用程序,而又不适合放置在某个局部位置的功能,否…

Android_项目文件结构目录分析

android项目文件结构目录分析 在此我们新建了一个helloworld的项目,先看一些目录结构: 这么多的文件夹和文件中,我们重点关注是res目录、src目录、AndroidManifest.xml文件: 一、res目录主要是用来存放android项目的各种资源文件&…

实体 联系 模型mysql_数据库系统概念读书笔记――实体-联系模型_MySQL

bitsCN.com数据库系统概念读书笔记——实体-联系模型前言为了重新回顾我写的消息系统架构,我需要重新读一下数据库系统概念的前三章,这里简单的做一个笔记,方便自己回顾基本概念实体-联系(E-R)数据模型基于对现实世界的这样一种认识&#xff…

使用Twitter Bootstrap,WebSocket,Akka和OpenLayers玩(2.0)

原始帖子可以在ekito网站上找到。 对于我们的一位客户,我们需要显示一张具有实时更新的车辆位置的地图。 因此,我开始使用Play制作原型! 框架及其最新发布的版本2.0,使用Java API。 我从Play的网络聊天室开始! 2.0个样…

mysql 5.6.23免安装_mysql5.6.23免安装配置

1.官网下载,并解压2.环境变量,path下,追加mysql的bin路径D:\Program Files\mysql\bin;3.mysql目录下的my-default.ini重命名为my.ini,并添加下面的代码basedirD:/Program Files/mysql #mysql路径datadirD:/Program Files/mysql/d…

在Intellij IDEA中运行Vaadin应用

在本文中,我将向您展示如何使用Intellij IDEA运行vaadin应用程序。 Vaadin提供了一些用于Eclipse和Netbeans的插件。 但是对于Intellij IDEA来说,还没有插件。 但是部署vaadin应用程序比其他两个IDE容易。 这是您要遵循的步骤。 1.首先创建一个新项目&am…

mysql主从数据库

Mysql主从配置,实现读写分离 大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够。到了数据业务层、数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连…

Java EE 6示例– Galleria –第3部分

关于Galleria示例的先前文章( 第1 部分 | 第2部分 | 第3部分 | 第4部分 )指导您完成基础知识以及对GlassFish和WebLogic的初始部署。 从今天开始,我尝试在其中添加一些企业级功能,因为我发现他们在自己的项目中提出了很多要求。 我…

在 Windows 上测试 Redis Cluster的集群填坑笔记

redis 集群实现的原理请参考http://www.tuicool.com/articles/VvIZje集群环境至少需要3个节点。推荐使用6个节点配置,即3个主节点,3个从节点。新建6个文件夹 分别是 7000/7001/7002/7003/7004/7005将redis.windows.conf 复制一份然后修改配置文件中的下面…

拓扑排序最长链-P3119 [USACO15JAN]草鉴定Grass Cownoisseur

https://www.luogu.org/problem/show?pid3119 本来我是来练习tarjan的,结果tarjan部分直接copy了,反而拓扑排序部分想了好久; 这道题SZB大神两次就AC; 但我等到AC,写好题解就只能洗洗睡了; 唉~ 差距怎…

IBM JVM调整– gencon GC策略

本文将向您详细介绍从Java虚拟机(例如HotSpot或JRockit)迁移到IBM JVM时重要的Java堆空间调整注意事项。 该调整建议基于我为我的一个IT客户端执行的最新故障排除和调整任务。 IBM JVM概述 正如您可能从其他文章中看到的那样,IBM JVM在某些方…

懒惰的JSF Primefaces数据表分页–第2部分

页面代码非常简单&#xff0c;没有复杂性。 检查“ index.xhtml”代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www…

java实现报表_用存储过程和 JAVA 写报表数据源有什么弊端?

用存储过程和 JAVA 写报表数据源有什么弊端&#xff1f;跟着小编一起来一看一下吧&#xff01;我们在报表开发中经常会使用存储过程准备数据&#xff0c;存储过程支持分步计算&#xff0c;可以实现非常复杂的计算逻辑&#xff0c;为报表开发带来便利。所以&#xff0c;报表开发…