Significant Suffixes

Significant Suffixes

我们定义 ssuf(S) 表示 S 中可能成为最小后缀的后缀,形式化定义为

  • suf(S) 表示 S 的所有后缀;
  • minsuf(S) 表示 S 的最小后缀;
  • 定义 ssuf(S){x|xsuf(S),T,STminsuf(ST)}

下面给出 ssuf 的两个性质

Lemma1#

对于 U,Vssuf(S)|U|<|V|UVborder,证明如下:

由于 U,V 都是 S 的后缀,所以必定存在包含关系,所以 UV 的后缀。

如果 U 不是 V 的前缀,无论向串后面加怎样的 T,那么 UTVT 的大小关系由 UV 决定,所以 U,V 只有一者有可能是属于 ssuf(S),矛盾,所以 UV 的前缀。

所以 U 一定是 Vborder.

Lemma2#

对于 U,Vssuf(S)|U|<|V|2|U|<|V|,证明如下:

考虑反证 |U|<|V|2|U|,由 Lemma1 可知 UVborder,所以有 |V||U| 的周期 T,则有 U=TC,V=TTC.

向串后面加入任何字符串 R,那么若 UR=TCR<VR=TTCRCR<TCRCR<UR,注意到 C 也是后缀,所以 U 必定不可能为最小后缀,而若是 UR>VRU 也不可能为最小后缀,矛盾,所以 2|U|<|V|.

根据 Lemma2,有 |ssuf(S)|=O(log|S|).

「ZJOI2017」字符串#

考虑用线段树合并维护 ssuf 的集合,合并 |S1|,|S2|ssuf 时由于 |S2||S1||S2|+1 所以 ssuf(S1) 中至多有 1 个属于 ssuf(S1S2).

考虑如何选出那个元素,设 U,Vssuf(S1) 不妨设 US2<VS2,如果 US2 不是 VS2border,那么 VS2 可以排除,否则 US2 可以排除,设最后留存的为 P,直接使 ssuf(S1S2)=ssuf(S2){P},能够保证复杂度,但是常数较大,考虑挑出 S2 中不合理的.

然后考虑 Vssuf(S2),那么

  • VP 的前缀,不做任何操作;
  • V 不是 P 的前缀,且 V<P,抛弃 P
  • V 不是 P 的前缀,且 V>P,抛弃 V

这样可以有效减小常数。

查询时,我们将 O(log2n) 的集合全部检查一遍,检查和合并时我们需要比较两个字符串的大小,修改时由于影响到 O(logn) 个线段树节点,而且被修改区间完整覆盖的 ssuf(S) 不发生变化,所以总共需要 O(nlogn+mlog2n) 次比较,考虑使用数据结构维护 Hash 二分实现,这样需要 O(nlog2n+mlog3n) 次查询和 O(m) 次修改,由于查询和修改不平衡,可以使用 O((n)) 修改和 O(1) 查询的分块维护。总复杂度为 O(nlog2n+mlog3n+mn).

作者:littlepinkpig

出处:https://www.cnblogs.com/littlepinkpig/p/18498231

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

你可以在这里自定义其他内容

作者:littlepinkpig

出处:https://www.cnblogs.com/littlepinkpig/p/18498231

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   little_pinkpig  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu