border 性质梳理

news/2024/10/22 19:23:55

建议看到结论之后直接画图自己推

目前定义 \(s[l,r]\) 为字符串 \(s\)\([l,r]\),定义 \(nxt_i\) 为 KMP 算法所得。

定义: \(s[1,i]=s[n-i+1,n]\),则称 \(s[1,i]\)\(s\) 的一个 border

可能证明会比较浅显,但仅供笔者理解。

nxt树定义:连边 \(nxt_i\to i\) 的一棵树。

  1. 周期性

周期定义:对于 \(s[1,n]\),一个周期 \(t\) 等价于满足 \(\forall i,i+t\in [1,n],s[i]=s[i+t]\)
因此有 \(s[1,i]\) 为一个 border 等价于存在一个周期 \(t=n-i\)

Kmp的 \(nxt_i\) 表示 \(s[1,nxt_i]=s[i-nxt_i+1,i]\),是一个前缀的最大 \(border\)

  1. 总和性

对于 \(s[1,n]\) 的所有 \(border\) 长度由以下代码给出:
int t=nxt[n];vector<int>border;while(t)border.push_back(t),t=nxt[t]
这等价于 nxt 树上 \(n\) 的所有祖先。

证明仅需考虑假设一个 \(nxt_{nxt_i}<k<nxt_i\),那么可以推出 \(k=nxt_{nxt_i}\) 即可。

应用:\(s[1,i]\)\(s[1,k]\) 的出现次数,等价于 nxt 树上的点 \(i\) 的子树中所有 \(\le k\) 的节点个数。

变形:在 \(t[1,m]\) 中,\(s[1,n]\) 的出现次数。构造 \(G=s+?+t\) 即可。

  1. 匹配性:

对于 \(j<k\) 为两个 border。
那么对于原串 \(s\),任意一个位置满足 \(s[pos-k+1,pos]=s[1,k]\),就有 \(s[pos-j+1,pos]=s[1,j]\)
证明:因为 \(j<k\),所以 \(s[1,j]=s[k-j+1,k]\),后续自证不难。
同时在 nxt 树上的视角,\(j\)\(k\) 的祖先,且 \(pos\) 属于子树 \(k\)。自然属于子树 \(j\)

  1. 最小表示可行性

对于一个字符串 \(s[1,n]\),若 \(p\) 为这个字符串循环最小表示的开头位置,一个必要条件是:
存在一个字符串 \(t\),满足 \(s[p,n]+t\)\(s[1,n]+t,s[2,n]+t,\dots s[n,n]+t\) 最小值。

证明:这等价于对于后缀 \(s[k,n],k<p\),需要满足 \(s[p,n]<s[k,k+n-p]\),对于后缀 \(s[k,n],k>p\),需要满足 \(s[p,p+n-k]<s[k,n]\)

  1. 最小后缀相关

记后缀 \(suf_i=s[i,n]\)
记最小后缀为 \(minsuf\)
设集合 \(P\) 为在所有后缀后追加一个字符串 \(t\),可能成为最小后缀的后缀。

更详细地,这个可能成为最小后缀的后缀 \(suf_k\),满足对于 \(t<k\)\(s[t,t+n-k]<s[k,n]\),对于 \(t>k\)\(s[t,n]>s[k,k+n-t]\)
性质:

  • \(P\) 中串互为前缀(因为仅凭当前信息无法判断大小,所以长度较小串是长度较大串的前缀),同时长度较小串也是长度较大串的后缀,所以是 border 关系

  • \(\forall S,T\in P,|S|>|T|\),有 \(|S|>2|T|\)

    证明:

    \(|T|<|S|\le 2|T|\),则显然有存在串 \(AB\),有 \(S=AB,T=AAB\)

    其中 \(A\) 可空。

    考虑往后加入一个串 \(U\) 进行比较,则 \(ABU,AABU\) 相当于比较 \(BU,ABU\)

    • \(BU<ABU\),则可以推出 \(A\) 非空,且有后缀 \(B\) 优于 \(AB\) 也就是 \(S\),所以 \(S\) 并不是最小后缀,矛盾
  • 应用:「JSOI2019」节日庆典

\(|P|\le \log n\)

  1. 弱周期定理

\(p,q,p>q\)\(s[1,n]\) 的周期,\(p+q\le n\),那么 \(p-q\) 也是 \(s[1,n]\) 的周期。
推论:更相减损术得 \(\gcd(p,q)\)\(s[1,n]\) 的周期。
证明:\(s_i=s_{i+p}=s_{i+q}\implies s_i=s_{i+p-q}\)

  1. 周期定理

\(p,q\)\(s[1,n]\) 周期,\(p+q-\gcd(p,q)\le n\),则 \(\gcd(p,q)\)\(s[1,n]\) 周期。

证明类同。

  1. 前缀周期定理

\(s[1,i]\) 有周期 \(d\)\(s[1,n]\) 有周期 \(a\),若 \(d|a,i\ge a\),则 \(s[1,n]\) 也有周期 \(d\)
证明很简单,考虑 \(s[1,a]\) 由若干个 \(s[1,b]\) 重复组成。

  1. 等差数列定理 - version 1

对于 \(2|S|\ge |T|\),串 \(S\) 在串 \(T\) 中的匹配位置为等差数列。
设匹配位置为 \(b_1\sim b_m\)
我们考虑只保留串 \(T\)\([b_1-|S|+1,|b_m|]\) 部分,则简化为了一个 \(S\)\(T\) 的border的问题。
这样的话,我们不妨令这个新的串代替 \(T\),下面表述以新串为主。
可以知道由于 \(2|S|>|T|\),所以这些匹配位置所代表的区间有交。
那么对于 \(i,j\)\(T[b_i-|S|+1,b_i]=T[b_j-|S|+1,b_j]\),因此 \(b_j-b_i\) 就成为了一个周期,且完全覆盖。
根据弱周期定理,可以得到匹配位置是一个等差数列。

另一种想法:考虑两个周期 \(p,q,p<q\),可知 \(q=kp\)。因此这些个匹配位置之差都是一个周期,进而都是周期。

  1. 9.的重要推论:

考虑两个串 \(S,T\),定义集合 \(G=\lbrace k_1\sim k_n\rbrace,k\ge |S|/2,S[1,k]=T[n-k+1,n]\)

那么这也是个等差数列。

证明很简单,取出最大的 \(k\),然后很明显剩下的全是 \(S[1,k]\) 的border。

  1. 等差数列定理 - version 2

一个串的 \(border\) 按长度排序后,可以划分为 \(O(\log n)\) 个等差序列,也即周期同样可以。
反复运用 10.

将字符串划分为 \([2^{i-1},2^i-1]\) 若干段,这样可以遍历完所有的border。按照这样分组后每组贡献一条 border 等差数列链。

  1. \([1,i]\) 的所有 border 长度为 \(S(i)\),则 \(x\in S(i),x\neq 1\implies x-1\in S(i-1)\)

这个感觉挺显然的,因为 若 \([1,x]=[i-x+1,i]\),则 \([1,x-1]=[(i-1)-(x-1)+1,i-1]=[i-x+1,i-1]\)

  1. 延续 12. 的定义,则有 \(S(nxt_i)\subseteq S(i)\),且差的那一部分恰可以从 \(S(i-1)\)\(\ge nxt_i\) 的那部分元素补上来

    应用:QOJ 9372

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PbootCMS提示错误信息“未检测到您服务器环境的sqlite3数据库扩展

检查并开启 sqlite3 扩展打开 PHPStudy Pro 软件。 导航至设置 -> 配置文件 -> php.ini。 选择你当前使用的 PHP 版本(例如 php7.3.4nts)并点击打开 php.ini 文件。 在 php.ini 文件中搜索 extension=sqlite3。 如果该行被注释掉(前面有分号 ;),则去掉分号以启用扩展…

PbootCMS上传空间后前台打开内页显示404错误怎么解决

检查 URL 规则配置登录 PbootCMS 后台。 导航至 配置参数 -> URL规则。 选择 伪静态模式 并保存。添加伪静态规则根据你的服务器环境,选择合适的伪静态规则文件。 一般情况下,Apache 环境使用 .htaccess 文件。Apache 环境配置将 rewrite 文件夹中的 .htaccess 文件复制到…

例题2.3

例题2.3代码 L = [abc, 12, 3.45, python, 2.789] print(L) print(L[0]) L[0] = a L[1:3] = [b, Hello] print(L) L[2:4] = [] print(L)

习题2.5

习题2.5代码 import numpy as np import pandas as pd import sympy as sp sp.init_printing(use_unicode=True) import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[Times New Roman + SimSun + WFM Sans SC] plt.rcParams[mathtext.fontset]=cm Times New Roma…

高等数学 7.7常系数齐次线性微分方程

在二阶齐次线性微分方程 \[y + P(x)y + Q(x)y = 0 \tag{1} \]中,如果 \(y, y\) 的系数 \(P(x), Q(x)\) 均为常数,即 \((1)\) 式成为 \[y + py + qy = 0 \tag{2} \]其中 \(p, q\) 是常数,那么称 \((2)\) 为二阶常系数齐次线性微分方程。如果 \(p, q\) 不全为常数,就称 \((1)…

线性代数--线性方程组

线性方程组有解的判定 {x1+x2+x3=1x1−x2−x3=−32x1+9x2+10x3=11系数矩阵:A=(1111−1−12910)增广矩阵:A=(11111−1−1−3291011) n是未知量的个数,m是方程的个数怎么判断秩是否相等步骤:通过方程,写出增广系数矩阵 只做初等行变换,化为阶梯型 看系数矩阵的秩和增广系数…

Python 应用可观测重磅上线:解决 LLM 应用落地的“最后一公里”问题

本文将从阿里云 Python 探针的接入步骤、产品能力、兼容性等方面展开介绍。并提供一个简单的 LLM 应用例子,方便测试。作者:彦鸿 背景 随着 LLM(大语言模型)技术的不断成熟和应用场景的不断拓展,越来越多的企业开始将 LLM 技术纳入自己的产品和服务中。LLM 在自然语言处理…

计算机视觉领域的实际应用有什么

计算机视觉在多个行业和应用场景中有着广泛的实际应用,主要包括医疗图像分析、自动驾驶、物体检测、人脸识别、增强现实(AR)和虚拟现实(VR)、工业自动化、农业监测等。医疗图像分析用于诊断疾病和制定治疗方案,提高医疗服务的质量和效率。其中,自动驾驶是一个相对成熟的…