专栏文章
AT_abc434_f [ABC434F] Concat (2nd) 题解 / Z 函数学习笔记
题解参与者 1已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mimxilu9
- 此快照首次捕获于
- 2025/12/01 17:10 3 个月前
- 此快照最后确认于
- 2025/12/01 17:10 3 个月前
题目基本信息
考察:Z 函数,字符串,贪心(个人认为中位紫)。
题目简介:
给定 个由小写英文字母构成的字符串 ,你可以选择一个 阶排列 ,取最终字符串为 ,其中 表示字符串拼接,求所有能得到的字典序非严格次小的最终字符串。
数据范围:
题目简介:
给定 个由小写英文字母构成的字符串 ,你可以选择一个 阶排列 ,取最终字符串为 ,其中 表示字符串拼接,求所有能得到的字典序非严格次小的最终字符串。
数据范围:
这是一道经典题目,我们更常见的是求字典序最小的字符串,所以我们先介绍怎么求最小。
由于交换任意两项可以通过多次交换相邻两项得到,所以我们仅需论证交换相邻两项何时会变优即可,至于为何贪心交换一定最优会在后面论证。
为书写方便令 ,现在我们将 交换 和 两项变成 ,那么 到 字典序相同,我们容易得到判定条件:若 (现在 位于 前)交换后变优当且仅当 。
不妨将 记为 。
那么这个 的排序条件可排序吗?也就是说 是否具有传递性?
由于交换任意两项可以通过多次交换相邻两项得到,所以我们仅需论证交换相邻两项何时会变优即可,至于为何贪心交换一定最优会在后面论证。
为书写方便令 ,现在我们将 交换 和 两项变成 ,那么 到 字典序相同,我们容易得到判定条件:若 (现在 位于 前)交换后变优当且仅当 。
不妨将 记为 。
那么这个 的排序条件可排序吗?也就是说 是否具有传递性?
证明
遇到这种东西我们的思路就是移项,但是现在我们是字符串运算我们不能移项,所以我们考虑将其替换。
注意到 和 长度相同,所以我们可以把它们哈希成一个 进制数,设 的哈希为 , 的哈希为 ,那么 等价于 ,这时移项可以得到:
这个东西显然有传递性,证毕。
注意到 和 长度相同,所以我们可以把它们哈希成一个 进制数,设 的哈希为 , 的哈希为 ,那么 等价于 ,这时移项可以得到:
这个东西显然有传递性,证毕。
同时我们注意到,上面满足那坨东西的一定是最优的,至于其它的我们一定可以交换相邻两项,这时我们补上了贪心交换的正确性。
那么这样你直接排序能通过 P1012,时间复杂度是 的,这个题就不太能过了。
下文启用 1-base。
我们注意到此时一次比较时间复杂度为 ,我们观察到我们至少将比较时间降至 才能通过,那么我们考虑优化。
那么这样你直接排序能通过 P1012,时间复杂度是 的,这个题就不太能过了。
下文启用 1-base。
我们注意到此时一次比较时间复杂度为 ,我们观察到我们至少将比较时间降至 才能通过,那么我们考虑优化。
-
当 时, 与 同量级,可以直接比。
-
否则不妨钦定 ,分成三部分:
- 先比较 和 ( 表示 到 的字符拼接形成的字符串)的大小关系。
- 再比较 和 的大小关系。
- 最后比较 和 的大小关系。
容易发现中间一部分最耗时,考虑优化。注意到这是同一字符串内的操作,所以我们可以预处理,但是预处理大小关系是不现实的,我们可以考虑快速找到第一个不同的位置,所以我们可以计算 和 的每一个后缀的 LCP 长度,唉这不就是 Z 函数吗,直接算就行了。
Z 函数介绍
下文切换 0-base。
设 表示 和 的 LCP 长度, 无讨论价值,不考虑在内。
我们考虑在计算 时充分利用 到 的所有值,据 的定义我们可以得到 和 相同,所以当 时我们可以直接利用,由于我们是正序枚举所以 必然成立,我们只需要找最大的 然后利用即可。
具体而言,令 为上述的最大的 的 ,然后分讨:
设 表示 和 的 LCP 长度, 无讨论价值,不考虑在内。
我们考虑在计算 时充分利用 到 的所有值,据 的定义我们可以得到 和 相同,所以当 时我们可以直接利用,由于我们是正序枚举所以 必然成立,我们只需要找最大的 然后利用即可。
具体而言,令 为上述的最大的 的 ,然后分讨:
- 若 ,我们可以利用前面的 Z 函数。
- 若 ,那么我们直接令 ,且容易发现不会继续扩展答案。
- 否则,令 ,并暴力扩展。
- 否则初值为 直接扩展。
- 然后更新 。
注意到每次扩展都会令 增长,所以时间复杂度为 。
下文切换回 1-base。
好的根据上述我们求出了字典序最小字符串,那么怎么求次小呢?
好的根据上述我们求出了字典序最小字符串,那么怎么求次小呢?
- 如果存在一对字符串(排序后显然相邻)使得 那么实际上次小也是最小。
- 否则通过手玩我们断言:最终答案要么是: 要么是:
证明
多次交换和交换不相邻位置非次优可以通过反证证明。
设交换一个 得到了 ,那么由于原串与最小串不等,那么我们只需要找到第一个不等位置即可,容易发现不等位置 ,容易发现一定不比交换 优。
证毕。
设交换一个 得到了 ,那么由于原串与最小串不等,那么我们只需要找到第一个不等位置即可,容易发现不等位置 ,容易发现一定不比交换 优。
证毕。
时间复杂度为 ,空间复杂度为 。
坑点
哦题解说得对,我们可以通过 Z 函数优化时间复杂度,好的开写。
怎么这么多
CPP怎么这么多
s[x] 和 s[y],太长了,改一下吧。string a=s[x],b=s[y];
TLE。
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...