1 条题解

  • 0
    @ 2025-8-24 22:35:26

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Petit_Souris
    鼓励的话语 无论多少次我都会说给你听 | 你在名为弱小的深渊 究竟看见过什么 | 天空中出现了一种罕见的天文现象

    搬运于2025-08-24 22:35:26,当前版本为作者最后更新于2023-05-27 10:06:27,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    和 CTSC 歌唱王国几乎一致的题目,我来推广一个(比较组合意义的)有趣解法。参考了 WYXkk 在那题的题解知乎上的一个回答

    题意:给定一个字符串 SS,长度为 MM。字符集大小为 NN。有一个字符串 TT,初始为空。每秒随机在字符集当中选一个字符加到 TT 的末尾,对于每个 SS 的前缀 pp 求出期望几秒之后 pp 成为了 TT 的子串。M106,N100M\le 10^6,N\le 100

    初看这道题感觉除了把 KMP 自动机建出来消元以外没有好的多项式复杂度做法,但是这个故事的解释很精妙。

    我们先对一个单独的 SS 求解,不考虑前缀的问题。假设拥有这个会自动吐字符的字符串 TT 的人开了一座赌场,设计了这样一个游戏:

    支付 kk 块钱玩一次游戏,猜 TT 的下一个出现的字符为 xx。如果猜对了,返还 NkNk 块钱,否则游戏结束。

    这个游戏显然是绝对公平的——每次有 1N\frac{1}{N} 的概率猜对,因此赌场不赚不赔。

    我们假设有无限多个赌徒依次进入赌场玩这个游戏。第 11 位赌徒有 11 块钱,在第 11 秒进入,他猜测接下来会出现 S1S_1。如果猜对了,把刚刚获得的全部 NN 块钱押第 22 秒出现 S2S_2。如果再猜对,把获得的全部 N2N^2 块钱押第 33 秒出现 S3S_3......对于其他赌徒也是相同的:第 ii 位赌徒在第 ii 秒进入赌场,把所有的 NjN^j 块钱押接下来出现 Sj+1S_{j+1},依此类推......一旦有一位赌徒连续猜对了 MM 次,赌场老板就会因为觉得自己亏了而关闭赌场。

    我们现在假设猜对了 MM 次的是第 tt 位赌徒,那么我们观察一下在赌场关门倒闭了以后,哪些赌徒手上还有钱,以及他们分别有几块钱:

    • t1t-1 位以及之前的赌徒都空手而归。

    • tt 位赌徒有 NMN^M 块钱。

    • 在第 tt 位之后的赌徒还可能有钱,这时候他们猜的串是 SS 的一个后缀,它又应该和 SS 的前缀相同,因此如果第 t+kt+k 位赌徒没有空手而归,他应该代表了一个 border。且如果 border 长度为 ll,他会拥有 NlN^l 块钱。

    不难发现按照这样的分析,SS 的每个 border 都会对应一位赚到钱的赌徒,并且每个 border 只会出现恰好一次。

    如果我们假设 SS 的 border 长度集合为 BB,那么所有赌徒手上的资金总和为 xBNx\sum\limits_{x\in B}N^x

    最后我们要将赌徒的钱和赌场老板的字符串 TT 的长度找出联系。赌场在这个游戏期望下不赚不赔,因此赌徒这个整体也是不赚不赔的。而又由于期望拥有 xBNx\sum\limits_{x\in B}N^x 块钱,每个赌徒初始有 11 块钱,所以赌徒的个数也是 xBNx\sum\limits_{x\in B}N^x。因此游戏的期望时长也是 xBNx\sum\limits_{x\in B}N^x 秒,也即为所求的答案。

    此时回到原题目,发现我们做一遍 KMP 求出 border,沿着 fail 指针跳 dp 就可以算出答案了,时间复杂度 O(M)\mathcal O(M)。(最后的实现如果有不理解的建议参考其他题解,这里不多赘述)。

    • 1

    信息

    ID
    7393
    时间
    1000ms
    内存
    64MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者