AT_abc434_f [ABC434F] Concat (2nd) 题解 / Z 函数学习笔记

· · 题解

:::::info[题目基本信息] 考察:Z 函数,字符串,贪心(个人认为中位紫)。
题目简介:
给定 n 个由小写英文字母构成的字符串 \{s_n\},你可以选择一个 n 阶排列 \{p_n\},取最终字符串为 res=s_{p_1}+s_{p_2}+\dots+s_{p_n},其中 + 表示字符串拼接,求所有能得到的字典序非严格次小的最终字符串。
数据范围:

:::::success[Z 函数介绍]{open} 下文切换 0-base。
z_i 表示 ss[i,|s|-1] 的 LCP 长度,z_0 无讨论价值,不考虑在内。
我们考虑在计算 z_i 时充分利用 z_1z_{i-1} 的所有值,据 z_i 的定义我们可以得到 s[0,z_i-1]s[i,i+z_i-1] 相同,所以当 i\in[j,j+z_j-1] 时我们可以直接利用,由于我们是正序枚举所以 i>j 必然成立,我们只需要找最大的 j+z_j-1 然后利用即可。
具体而言,令 l 为上述的最大的 j+z_j-1j,然后分讨:

注意到每次扩展都会令 l+z_l 增长,所以时间复杂度为 $\Theta( s )$。

下文切换回 1-base。
好的根据上述我们求出了字典序最小字符串,那么怎么求次小呢?

code
:::::warning[坑点] 哦题解说得对,我们可以通过 Z 函数优化时间复杂度,好的开写。
怎么这么多 s[x]s[y],太长了,改一下吧。

string a=s[x],b=s[y];

TLE。
:::::