首页 > 其他分享 >基本子串结构

基本子串结构

时间:2023-06-18 14:56:51浏览次数:43  
标签:子串 基本 SAM 后缀 压缩 等价 ext 结构 mathrm

参考 xtq 2023 年论文《一类基础子串数据结构》

定义

  • 出现次数:对于一个串 \(s\),\(\mathrm{occ}(t)\) 表示 \(t\) 在 \(s\) 中出现次数。
  • 扩展串:\(\mathrm{ext(t)}\) 表示最长的包含 \(t\) 的串 \(t'\) 满足 \(\mathrm{occ(t')} = \mathrm{occ(t)}\),分别定义 \(\mathrm{Lext(t)}\) 和 \(\mathrm{Rext(t)}\) 表示以 \(t\) 为后 / 前缀的最长串 \(t'\) 满足 \(\mathrm{occ(t')} = \mathrm{occ(t)}\)。
  • 等价类:两个字符串 \(x, y\) 等价当且仅当 \(\mathrm{ext(x)} = \mathrm{ext(y)}\),特别地,若 \(\mathrm{ext(t)} = t\),称 \(t\) 为所在等价类的代表元。记作 \(\mathrm{rep(A)}\)

容易证明 \(\mathrm{ext, Lext, Rext}\) 都是良定义的。我们现在想建立一种字符串结构,一个节点代表一个等价类,且可以实现在两边加字符链接到新的等价类。

压缩后缀自动机

考虑 SAM 上的一个节点,若其出度 > 1,则其右侧代表的内容不为 1,显然不能向右扩展;若表示一个后缀节点,往右边扩展就没东西了,也不能向右扩展。若 \(x\) 既不表示后缀,且出度 = 1,说明其每次出现后面加的字符都是一样的,则此时 \(x\) 可以和其唯一出边 \(y\) 合并,他们对应的 \(\mathrm{ext}\) 相同,重复这样的合并,就有:

  • 压缩后缀自动机:将 SAM 上出度为 1 且不为后缀的节点与其出边合并,得到的自动机称为压缩后缀自动机。

 (luogu.com.cn)

上图为 abbab 及其反串的 SAM 及压缩 SAM。

你可以认为压缩 SAM 合并了所有的 \(\mathrm{ext}\) 等价类,分别得到了后缀的等价类和前缀的等价类,而且两个压缩 SAM 上的节点应该是一一对应的(\(\mathrm{ext}\) 和正反无关)因此:

  • 对称压缩后缀自动机:将两个压缩 SAM 的对应节点结合,同时保留两个自动机上的转移,得到的结构为对称压缩后缀自动机。

将所有字符串按照第一次出现位置 \([l, r]\) 画在平面坐标系中,将所有在同一个等价类的字符串染上同一种颜色,得到的结构称为基本子串结构。

(luogu.com.cn)

本质不同的块和压缩 SAM 上的节点一一对应,压缩 SAM 上的边可以看作横向或者竖向(分别表示反串 SAM 和 正串 SAM)的转移。

一些性质:

  • 每一块是一个上端和左端对齐的阶梯形网格图
  • 每种本质不同的块 \(C\),出现了 \(\mathrm{occ(rep(C))}\) 次。
  • 一块中的一行对应一个 endpos 等价类,一列对应一个 startpos 等价类。
  • 定义等价类 \(C\) 的周长为行数与列数之和,则所有本质不同的块周长之和为 \(\mathcal{O(n)}\) 级别。

标签:子串,基本,SAM,后缀,压缩,等价,ext,结构,mathrm
From: https://www.cnblogs.com/henrici3106/p/17489131.html

相关文章

  • 获取cpu、memory、disk的基本情况
    #!/bin/bash#获取逻辑CPU个数processors=`cat/proc/cpuinfo|grep"processor"|wc-l`functioncpu(){NUM=1while[$NUM-le$processors];doutil=`vmstat|awk'{if(NR==3)print100-$15"%"}'`user=`vmst......
  • MySQL数据库页存储结构学习与了解
    MySQL数据库页存储结构学习与了解背景MySQL总是出现奇奇怪怪的问题.想着自己能够学习与提高一下.最近看了很多文档.关于MySQL数据库相关的.想着总结和提炼一下,希望能够给未来的工作提供一下指导.MySQL的存储引擎MySQL有多种存储引擎,主要有:InnoDB:是MySQL的默认存储引擎。......
  • 项目管理-进度管理阶段基本知识整理
    总结项目管理中是十大知识域的输入输出中重点内容如下图:......
  • Docker基本命令
    系统命令systemctlstartdocker#启动dockersystemctlstopdocker#停止dockersystemctlrestartdocker#重启dockersystemctlenabledocker#设置docker开机自启基本命令dockerversion......
  • 算法与数据结构Day01
    希尔排序的实现#include<stdio.h>#include<stdlib.h>typedefintKeyType;typedefstruct{KeyType*elem;/*elem[0]一般作哨兵或缓冲区*/intLength;}SqList;voidCreatSqList(SqList*L);/*待排序列建立,......
  • 算法与数据结构Day02
    修建道路#include<stdio.h>#include<string.h>#include<algorithm>usingnamespacestd;intinf=0x3f3f3f;intmap[105][105],dis[105],book[105];intm,n;intprim(){inti,j,k,sum=0,u,min;for(i=1;i<=n;i++){......
  • Hibernate框架【五】——基本映射——多对多映射
    系列文章目录Hibernate框架【三】——基本映射——一对一映射Hibernate框架【四】——基本映射——多对一和一对多映射基本映射——多对多映射系列文章目录前言一、多对多映射是什么?二、hibernate多对多关联映射(单向)1.实体结构2.示意图3.对应的实体xml配置文件4.生成的表结构5.核......
  • 【React工作记录一百一十二】React(Hook)+TS+axios+ant design+json server实现todoli
    前言大家好我是歌谣最近开始在做关于前端扫盲的一些只是处理花了一周左右录制了了一个hook写法的关于todoList的视频主要用于基础知识的一个使用和处理目录#前端巅峰人才交流群私信我#第一节创建项目todolist项目技术选型React(Hook)+TS+axios+antdesign+jsonserve......
  • 算法与数据结构——kmp算法
    7-1jmu-ds-实现KMP分数 10#include<stdio.h>#include<iostream>#include<string.h>usingnamespacestd;constintMAX_LEN=20010;//本题运用到字符串比对中的next[j]求法具体算法可以直接百度//get_next就是用于求next[j]的这里只需要传入目标串就行voidget_nex......
  • JWT的基本组成结构
    JWT组成结构1.令牌组成1.标头(Header)2.有效载荷(Payload)3.签名(Signature)因此,JWT通常如下所示:xxxxx.yyyyy.zzzzzHeader.Payload.Signature2.Header标头通常由两部分组成:令牌的类型(即JWT)和所使用的签名算法,例如HMACSHA256或RSA。它会使用Base64编码组成JWT......