字符串合集

Problem A. P7409 SvT

题意:

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

1n5×1051ki3×106,时限 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|s|,|t|105,字符集为小写英文字母。

解法:

假设 n=|s|m=|t|

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

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

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

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

Submission Link.

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

题意:

给定 n 个小写英文字符串 s1,s2,,sn。你需要在每个字符串中删去至多 1 个位置的字符,使得最终 s1s2sn,其中 按照字典序比较。你要求有多少符合条件的方案,答案对 109+7 取模。删去不同的位置得到同样的字符串算两种方案。

1n105|si|106。时限 1.5 秒,空间限制 250 MB。

解法:

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

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

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

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

Submission Link.

Problem D. [ARC060F] Best Representation

题意:

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

1n5×105,时限 2 秒。

解法:

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

其实这是一个诈骗题。

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

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

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

结论 1

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

证明:

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

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

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

证毕。

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

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

结论 2

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

证明:

我们考虑反证。考虑整个字符串 s 有最小非平凡整周期 x>1,假设 s[1n1] 有最小非平凡整周期 y1,显然 x 也为 s[1n1] 的一个周期。此外有 xn2yn12,则有 x+yn1。根据弱周期引理,我们得到 s[1n1] 有一个长度为 gcd(x,y) 的周期。由于 y 是最小非平凡整周期,gcd(x,y)=y,故 yx。由于 xn,所以 yn。但是 y 又是 s[1n1] 的整周期,所以 yn1,所以 y=1,与最小整周期长度大于 1 矛盾。

证毕。

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

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