我的第一个题目·花絮

最近我出的一个题目在一个公开赛中用上了,也成为了我 OI 生涯中第一个在主题库中的题目。为了纪念,我决定写一个花絮。

有一段时间之前,我学习了 Lyndon Word,并且找到了一个博客。我发现那个 \(k\) 分割问题很有意思,但是当时不会。现在会了,我的题解如下:

Solution 给定一个字符串 $s$ 和 $k$,把 $s$ 划分成 $n\le k$ 个串 $t_1,\cdots ,t_n$,问 $\max(t_i)$ 的最小值。

解法:

首先考虑没有 \(k\) 的限制怎么做。可以发现如下性质:

  • \(t_i\) 是 LW。

证明:如果 \(t_i\) 不是,那么存在 \(t_i=t'\textsf{suf}(t_i,l)\),其中 \(\textsf{suf}(t_i,l)<t_i\)。同样的 \(t'<t_i\),所以把 \(t_i\) 拆成 \(t'\)\(\textsf{suf}(t_i,l)\) 会更优。

  • \(t_1\ge t_2\ge \cdots \ge t_n\)

证明:只需要证 \(t_i\ge t_{i+1}\) 即可。如果 \(t_i<t_{i+1}\),分两种情况:

  1. 如果 \(t_i\)\(t_{i+1}\) 的前缀。那么设 \(t_{i+1}=t_iu\)。如果 \(u\le t_i\),可以把 \(t_i,t_{i+1}\) 变成 \(t_i,t_i,u\),否则可以合并 \(t_i,t_{i+1}\)
  2. 否则可以合并 \(t_i,t_{i+1}\)

因此 \(t_i\ge t_{i+1}\) 是不劣的。

发现这种性质符合 Lyndon 串,因此 \(t_1\sim t_n\)\(s\) 的 Lyndon 分解。

现在加入 \(k\) 的限制,因为 \(t_1\ge t_2\ge \cdots \ge t_n\),因此 \(\max(t_i)\) 取决于被分到多少个 \(t_1\),这个用鸽巢原理分类讨论一下即可。

注意到比赛前和管理说了这一题,管理说相关性不大。

在这个之前,我遇到了一个新的概念:子序列自动机(虽然这个东西都写过,但没想到还有名称),从而想到最大子序列。

起初,我认为这个题不是噗叽题,是从 dp 的角度先想的。这个也结束了前三个 Subtask,虽然我没有看到有人写了 \(\mathcal{O}(n^3)\) 或者 \(\mathcal{O}(n^3\log n)\)。分配来讲,

  • Subtask 1 是爆搜的。

  • Subtask 2 是 trivial 的 dp。

  • Subtask 3 考虑 pull\(\rightarrow\)pull,然后 dp 中不记录字符串而是字符串的 rank。

  • Subtask 4,5 是团友加的,感觉很好,很提示做法。

我第二个发现的性质是答案一定形如若干个最大值加上一段极长的没有最大值的 \(f\)。不知道是不是题解区那个二分的做法。后面发现我是奶龙,可以直接抽屉原理+少量分讨。

这个题目出出来大概是一两个月前。现在说说比赛筹备的花絮。

九月份基础赛是第一次交审的,我作为一个毫无经验的负责人。当时的题目组成与终版大相径庭:T2 不同,现 T4 在原 T3,原 T4 是一个神秘题。后面审核认为原 T2 太没有脑子、原 T4 发现了非噗叽的复杂度更优做法,于是要换掉。第二次较为正式的交审是原 T3 是现 T4,原 T4 是一个 fjy 题。但是后面因为[一些原因]又要换掉 T4。

审核说 T3 可以放在 T4,要出一个 T3。出题组内部有人投了一个我的[数据删除]题目过去,但是被评价为[不能放在基础赛的一些原因]。然后就投了现 T3 过去,得到了认可。

赛时,发现很多人挂,是预料之中的,毕竟细节还是有一点点的。看到自己的题目有 \(10\) k 提交(至现在),还是挺开心的。

posted @ 2024-12-22 11:44  SFlyer  阅读(299)  评论(5)    收藏  举报