大型分类讨论。
题意简述
称字符串 $s$ 为Gray
的串,仅当满足以下所有条件:
- $|s|$ 为奇数。
- 串正中间的字符仅在 $s$ 中出现一次。
- 要么 $|s| = 1$,要么删去中间的字符,左右是相等的
Gray
。
给一个字符串 $|S|$,一个字串 $s$ 若为Gray
,贡献为 $|s|^2$,否则贡献为 $0$。求更改最多 $1$ 个字符后整个串的最大总贡献。
$|S|\le 10^5$。
主要思路
设 $n = |S|$。不难发现Gray
的长度均为 $2^k - 1$,故总共只有 $O(n\log n)$ 个可能成为Gray
的字串。先考虑不修改求总贡献。
考虑 $[s_l, e_r]$ 是否为Gray
,假设 $[s_l, e_r] = [s_r, e_r]$ 且均为Gray
,则只需判断 $s_{s_r - 1}$ 是否字串 $[s_l, e_r]$ 中只出现一次即可。
求两个字串是否相等,后缀数组求 lcp 即可。
考虑将 $s_i$ 改为 $v$ 会发生什么:减掉先前所有包含 $i$ 的Gray
的贡献,再加上所有更改为 $v$ 后新的贡献。
包含 $i$ 的贡献 $c(i)$ 好求,维护差分,每次判断到一个Gray
更新即可。
而 $s_i$ 改为 $v$ 后的新贡献 $f(i, v)$ 不好直接求,考虑枚举每个可能为Gray
的字串是否更改 $1$ 个字符可变为Gray
。
- 对于一个
Gray
,仅可能更改中间的位置。 - 对于左半边右半边均非
Gray
的串,仅更改一个位置不可能。 - 对于左右均为
Gray
且相等,可能可更改中间位置。 - 对于左右至少有一个为
Gray
且左右字串仅相差 1 个字符的,可能可以更改该位置,注意同时保证中间位置的字符仅出现一次。
就结束了。使用后缀数组 $O(1)$ lcp,复杂度 $O(\Sigma n\log n)$。
参考代码
1 |
|