字符串合集

Problem A. P7409 SvT

题意:

给定一个长度为 \(n\) 的小写英文字符串 \(s\)\(q\) 次询问。每次给一个大小为 \(k_i\) 的整数集合,询问集合内两两不同数代表的后缀的 LCP 的长度和,对大质数取模。

\(1 \leq n \leq 5 \times 10^5\)\(1 \leq \sum k_i \leq 3 \times 10^6\),时限 \(3\) 秒,空间限制 \(512\) MB。

解法:

刻画后缀 LCP 的常见做法有很多。

一个做法是,考虑后缀排序,根据 SA 相关结论,两个后缀的 LCP 等价于区间 \(\min\)。询问时先进行相邻的 RMQ,然后单调栈求值即可。

另一方面,仍然考虑 SA,但是将区间 \(\min\) 刻画为笛卡尔树上 LCA 点权,显然对询问点建虚树即可。

不用 SA,直接考虑后缀树。容易发现后缀 LCP 等于后缀树上 LCA 到根路径长,进一步等于反串 SAM 的 Link 树上 LCA 的等价类最大长度。所以同样对询问点建虚树即可。

Submission Link.

Problem B. CF1090J Two Prefixes

题意:

给定字符串 \(s,t\),求 \(s\) 非空前缀与 \(t\) 非空前缀拼接后得到的本质不同字符串个数。

\(1 \leq |s|,|t| \leq 10^5\),字符集为小写英文字母。

解法:

假设 \(n = |s|\)\(m = |t|\)

考虑对于每个本质不同字符串,在最小的 \(s\) 的前缀位置统计答案。

不难发现对于每个 \(i\),有且仅有一段后缀 \([j,m]\) 符合 \(s[1 \cdots i]+t[1 \cdots j]\) 是之前没有出现过的。我们考虑二分这个 \(j\),问题变为给定 \(i,j\),判断是否存在 \(x < i\) 使得 \(s[1 \cdots x]+t[1\cdots i+j-x]=s[1 \cdots i]+t[1 \cdots j]\)。容易发现本质相当于我们找到 \(s[1 \cdots i]\) 的某个后缀,其与 \(t\) 的某个前缀相等,然后把 \(t[1 \cdots j]\) 往后平移相同。

\(t\)\(s\) 拼在一起,中间加个特殊符号。那么我们要找的后缀其实就是 Fail 树上的祖先。但是如果我们选了 \(s[1 \cdots i]\) 的一段长度为 \(k\) 的后缀,还需要判断 \(t[1 \cdots j]=t[k+1\cdots k+j]\) 是否成立。注意到这等价于 \(\operatorname{LCP}(t,t[k+1\cdots m]) \geq j\) 是否成立。于是先对 \(t\) 做一下 exKMP,然后在树上预处理每个点到根的点权最大值即可做到 \(O(1)\) 判定。

实际实现中不需要显式建树。

Submission Link.

Problem C. CF1393E2 Twilight and Ancient Scroll (harder version)

题意:

给定 \(n\) 个小写英文字符串 \(s_1,s_2,\cdots,s_n\)。你需要在每个字符串中删去至多 \(1\) 个位置的字符,使得最终 \(s_1 \leq s_2 \leq \cdots \leq s_n\),其中 \(\leq\) 按照字典序比较。你要求有多少符合条件的方案,答案对 \(10^9+7\) 取模。删去不同的位置得到同样的字符串算两种方案。

\(1 \leq n \leq 10^5\)\(\sum |s_i| \leq 10^6\)。时限 \(1.5\) 秒,空间限制 \(250\) MB。

解法:

DP 状态是简单的,记 \(f_{i,j}\) 表示前 \(i\) 个字符串,第 \(i\) 个字符串删除的位置为 \(j\) 的方案数。

考虑转移时有 \(f_{i,j} = \sum \limits_{k} f_{i-1,k}\),其中 \(k\) 要符合题意要求。如果对于每个 \(i\),将所有 \(j\) 按照删去后拼接前后缀的字符串字典序排序,那么可以双指针求出一段符合条件的 \(k\),显然这是 \(i-1\) 按照这个方式得到的一段前缀。进一步地,双指针部分的判定使用二分哈希就能判断字符串大小。对于排序,参见 P5329 [SNOI2019] 字符串,其本质是从前往后依次加入每个同字符连续段,手玩一下很容易理解。

排序部分是 \(O(\sum |s_i|)\) 的,二分哈希部分是 \(O(\sum |s_i| \log \sum |s_i|)\) 的。

进一步,容易知道二分哈希部分可以直接使用 SA 维护。使用线性 SA 维护手段理论可以做到线性。

Submission Link.

Problem D. [ARC060F] Best Representation

题意:

给定一个长度为 \(n\) 的小写英文字符串 \(s\),定义一个字符串 \(t\) 是好的,当且仅当其不存在非自身的整周期。你需要将 \(s\) 分为若干非空子串使得每部分都是好的。你需要求出最小的分段数量,以及段数等于最小分段数的分段方案数,答案对 \(10^9+7\) 取模。

\(1 \leq n \leq 5 \times 10^5\),时限 \(2\) 秒。

解法:

简单无脑做法是直接 \(f_i\)\(g_i\) 表示 \([1,i]\) 最小分段数量和方案数,目测不能降低到 \(O(n^2)\) 以下,优化前途不是很好。

其实这是一个诈骗题。

下文称非自身整周期为非平凡整周期。

考虑一些简单情况。若 \(s\) 所有字符相同,最小分段数量为 \(n\),方案数为 \(1\)。若 \(s\) 没有非平凡整周期,最小分段数量为 \(1\),方案数也为 \(1\)

手玩下其他情况,根据我们敏锐的直觉,我们断言其他情况下最小分段数量为 \(2\)。此时我们只需要判断每个前缀和后缀是否有非平凡整周期即可。这个直接调和级数哈希是可以的,其次考虑正着和反着 KMP 一次,记 \(\pi\) 为 KMP 得到的那个数组。根据下述结论,我们可以得到线性做法。

结论 \(1\)

一个串有非平凡整周期等价于最小非平凡周期为整周期。

证明:

右推左显然,考虑左推右。

考虑证明逆否命题:如果一个串最小非平凡周期不是整周期,则其必然不存在非平凡整周期。

假设长度为 \(n\) 的字符串 \(s\) 有最小非平凡周期 \(d \not \mid n\),若 \(d > \lfloor \dfrac n 2 \rfloor\),显然成立。否则考虑若存在非平凡整周期 \(y \mid n\),有 \(y \leq \lfloor \dfrac n 2 \rfloor\),则 \(d+y \leq n\),根据弱周期引理,存在长度为 \(\gcd(d,y)\) 的周期。若 \(\gcd(d,y)<d\),与 \(d\) 为最小非平凡周期矛盾。若 \(\gcd(d,y)=d\),则 \(d \mid y\),由于 \(d \not \mid n\),所以 \(y \not \mid n\),与假设矛盾,故不存在非平凡整周期。

证毕。

写一下其实就能过了,问题是为什么答案为 \(2\)

事实上,除了特殊情况,有除了 \(1\) 的非平凡整周期的字符串,将最后一个字符删去,必然没有非平凡整周期。也就是说,直接将第前 \(n-1\) 个字符和最后一个字符分段即可。

结论 \(2\)

若一个长度为 \(n\) 的字符串 \(s\) 存在最小非平凡整周期且最小整周期长度大于 \(1\),则删去最后一个字符,其必然不存在非平凡整周期。

证明:

我们考虑反证。考虑整个字符串 \(s\) 有最小非平凡整周期 \(x > 1\),假设 \(s[1\cdots n-1]\) 有最小非平凡整周期 \(y \geq 1\),显然 \(x\) 也为 \(s[1 \cdots n-1]\) 的一个周期。此外有 \(x \leq \lfloor \dfrac{n}{2} \rfloor\)\(y \leq \lfloor \dfrac{n-1}{2} \rfloor\),则有 \(x+y \leq n - 1\)。根据弱周期引理,我们得到 \(s[1 \cdots n-1]\) 有一个长度为 \(\gcd(x,y)\) 的周期。由于 \(y\) 是最小非平凡整周期,\(\gcd(x,y)=y\),故 \(y \mid x\)。由于 \(x \mid n\),所以 \(y \mid n\)。但是 \(y\) 又是 \(s[1 \cdots n-1]\) 的整周期,所以 \(y \mid n-1\),所以 \(y=1\),与最小整周期长度大于 \(1\) 矛盾。

证毕。

综上,这种情况下最小分段数量为 \(2\),代码很好写,这里就不放了。

posted @ 2024-12-02 20:59  HappyBobb  阅读(28)  评论(1)    收藏  举报