首页 > 其他分享 >SAM 学习笔记

SAM 学习笔记

时间:2023-02-20 13:00:26浏览次数:33  
标签:子串 SAM text 笔记 学习 endpos 字符串 mathtt

字符串,太抽象!

前置知识

  • 自动机

一些约定

若无特殊说明,以下默认字符串下标从 \(1\) 开始。

引入

在做字符串题的过程中,我们经常需要对一个字符串的所有子串做一些事情,但是直接暴力做是 \(\mathcal{O}(n^2)\) 的,非常慢。

于是有些毒瘤跳了出来,说:“我们能不能造出一个能够接受一个字符串 \(S\) 的所有子串的自动机,满足状态数和转移数都是 \(\mathcal{O}(n)\) 的呢?”

于是,SAM(Suffix Automaton)就这么诞生了。

基础想法

由于子串就是后缀的前缀,并且自动机天生就能接受一个串的所有前缀,那么我们就只需要能够接受所有的后缀就行了。

很不幸,直接暴力把后缀丢进 Trie 里复杂度是 \(\mathcal{O}(n^2)\) 的,我们需要优化。

可以发现对于一些状态,我们是可以合并的,具体的,对于两个状态,如果它们的入边和出边都是一样的,那么这两个状态就可以被合并。

但是按照这种规则进行合并构造 SAM,复杂度依旧是 \(\mathcal{O}(n^2)\) 的,没有改善。我们需要一些更强大的工具来帮助我们。

\(\text{endpos}\) 与 \(\text{endpos}\) 等价类

对于一个字符串 \(S\),我们定义它的一个子串 \(a\) 的 \(\text{endpos}\) 为 \(a\) 在 \(S\) 中所有的出现位置。例如,对于字符串 \(S=\mathtt{abcabb}\),\(\text{endpos}(\mathtt{ab})=\{2,5\}\)。

定理 1.1:对于两个子串 \(a,b\),设 \(|a|\le|b|\):

  • 若 \(a\) 是 \(b\) 的后缀,则 \(\text{endpos}(b)\subseteq\text{endpos}(a)\);
  • 否则,\(\text{endpos}(b)\cap\text{endpos}(a)=\varnothing\)。

证明:对于第一种情况,由于对于任何位置,只要 \(b\) 出现了,\(a\) 就一定会出现,故 \(\text{endpos}(b)\subseteq\text{endpos}(a)\);对于第二种情况

对于一系列 \(\text{endpos}\) 相等的子串,我们把它们统称为一个 \(\text{endpos}\) 等价类。

例如,对于 \(S=\mathtt{abab}\),由于 \(\text{endpos}(\mathtt{ab})=\text{endpos}(\mathtt{b})=\{2,4\}\),因此我们认为 \(\mathtt{ab}\) 和 \(\mathtt{b}\) 属于同一个 \(\text{endpos}\) 等价类。

标签:子串,SAM,text,笔记,学习,endpos,字符串,mathtt
From: https://www.cnblogs.com/bykem/p/17136964.html

相关文章

  • 机器学习-集成学习XGBoost
    目录前言基本原理常见应用特征选择参数调整XGBoost优缺点模型集成并行计算代码结论前言XGBoost(eXtremeGradientBoosting)是一种流行的机器学习算法,用于解决各种预......
  • Spring Cloud笔记
    单体应用存在的问题随着业务的发展,开发变得越来越复杂。修改、新增某个功能,需要对整个系统进行测试、重新部署。一个模块出现问题,很可能导致整个系统崩溃。多个开发团......
  • c#和.net 初见学习笔记(1)
    c#和.net背景介绍之类的就不再重复了,本次随笔记录从零开始学习c#和.net,有过java和python基础版本.net6、visualstudio2022接口和路由个人习惯,学习时先看项目代码,看......
  • 通信小白基础学习---MIMO技术入门,含码字,层映射,天线端口,预编码,PMI,rank,TM模式,波束赋形,空
    以下内容来源于B站up主“捻叶成剑”,如有侵权,请联系本人删除!载波聚合技术是增加带宽(拓宽车道),2*2MIMO是增加天线(增加车道为双车道)还有空分多址(实际应用不多)接收两......
  • Linux系统配置 Samba客户端
    参考:https://blog.csdn.net/m0_63624418/article/details/127856957  本文为局域网中linux和window共享文件方案——samba后续篇。 ============================......
  • 【博学谷学习记录】超强总结,用心分享 | 前端开发 Web APIs(五)
    WebAPIs-第5天笔记目标:能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力BOM操作综合案例1js组成JavaScript的组成ECMAScript:规定了js基础......
  • C++ primer 5th 第一章阅读笔记
    第一章开始第一节编写一个简单的C++程序不同编译器使用不同的后缀命名约定,比如cc、cpp、c。比如main程序保存到prog1.cc中,可以使用如下命令来编译它:ccprog1.cc。其中......
  • ChatGPT学习心得一(使用node+react做了一个案例)
    ​ 项目地址http://chat.xutongbao.top项目截图​编辑​编辑​编辑 ​编辑 ​编辑使用技术栈node+SQLite+redis+nginx+log4js+express+jenkins+cdn+react+ant......
  • Spring Boot笔记
    SpringBootSpringBoot是一个快速开发框架,可以迅速搭建出一套基于Spring框架体系的应用,是SpringCloud的基础。SpringBoot开启了各种自动装配,从而简化代码的开发......
  • Spring笔记
    Spring框架两大核心机制(IoC、AOP)IoC(控制反转)/DI(依赖注入)AOP(面向切面编程)Spring是一个企业级开发框架,是软件设计层面的框架,优势在于可以将应用程序进行分层,开发者可......