2025.10.13

正睿 2025 20 连测

赛时花了多久忘了。

2025.10.29 第二次写。

C

赛后看题解 \(15min\),写 \(45min\)

给定 \(N\) 个字符串和 \(k\)\(s, t\) 相似当且仅当 \(LCP(s, t) + LCS(s, t) + k \ge \max(|s|,|t|), ||s| - |t|| \le k\),求有多少对字符串相似。

考虑枚举 \(LCS(s, t)\)(记作 \(suf\)),把所有以 \(suf\) 为后缀的字符串拿出来,设为 \(s1, s2 \dots s_m\)

为了方便,将 \(s_i\) 按长度从小到大排序。枚举 \(s_i\),问题转化为 \(1 \sim i - 1\) 中有多少个 \(s_j\)\(s_i\) 相似。不难发现两个条件变成了 \(LCP(s_i, s_j) \ge p, |s_j| \ge q\) 的形式且 \(p, q\)\(|s_i|\) 增大而增大。

后一个条件比较简单,显然 \(j\) 一定是一段区间且左端点递增,搞个双指针即可。对于第一个条件,建出字典树,就是一个简单的单点加,区间求和问题(\(dfs\) 序),使用树状数组解决即可。

还有一些细节,比如说为了保证 \(LCS(s_i, s_j) = suf\),需要保证两个字符串的倒数第 \(|suf| + 1\) 个字符不同,开 \(26\) 个树状数组即可。

时间复杂度:\(O(\sum |S| \log \sum |S|)\)

赛场上看到 \(LCP\) 就去想后缀数组了,但是其实后缀数组算 \(LCP\) 还要并查集,也没有降低难度(不如直接枚举),合并时难以做到 \(O(\min sz)\) 的复杂度。

\(LCP \ge x\) 使用 trie。求 \(LCP\)max 考虑后缀数组。

第二次写一共 \(55min\)(包括看题。)

D

赛后看题解 \(10min\),写 \(60min\)

给定两个大小为 \(n\) 的数组 \(a, b\)\(b\) 单调不降),选 \(k\) 个下标 \(x_1 < x_2 < \dots < x_k\),求 \(\sum\limits a_{x_i} + b_{x_k} - b_{x_1}\) 的最大值。

有个暴力做法:枚举 \(x_1, x_k\) 那么就是求 \(a_{x_1 + 1} \sim a_{x_k - 1}\) 中最大的 \(k - 2\) 个之和,记作 \(f(x_1, x_k)\)

然后看上去没有头绪了,这时就可能需要盲猜一下是否有决策单调性。实际上是有的,只用证明 \(f\) 满足四边形不等式即可(剩下的一堆抵消了)。

所以问题变成了如何快速求 \(f(l, r)\)。可以使用类似莫队的方式移,使得只有删除和撤销操作,再使用链表维护。但是这很麻烦,常数不小。不如直接上主席树,常数也不大。

时间复杂度:\(O(n \log n) / O(n \log^2 n)\)

赛场上想到了暴力做法,但是没想到决策单调性,应该打打表看看的。

卡常:将 \(a\) 离散化,\(x_k\) 一定是 \(a_i + b_i\) 的前缀最大值。

第二次写总共 \(50min\)

posted @ 2025-10-15 23:06  xiehanrui0817  阅读(15)  评论(0)    收藏  举报