1 条题解

  • 0
    @ 2025-8-24 21:57:58

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar zhoutb2333
    **

    搬运于2025-08-24 21:57:58,当前版本为作者最后更新于2018-02-05 23:18:18,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    算法1:

    考虑将所有字符串的所有哈希值计算出来。那么枚举每一种情况并统计即可。复杂度O(NMx+xN)O(NMx+x^N)

    可以通过subtask 1subtask \ 1,预期得分2020分。

    算法2:

    仍然考虑将所有哈希值计算出来,但是统计答案时改为计算每个结果对ansans的贡献。

    等于i=0p1P(i\sum ^{p-1}_{i=0}P(i出现)1+P(i)*1+P(i不出现)0)*0

    即$\sum ^{p-1}_{i=0}( 1- \prod ^{N}_{j=1} \frac{x-cnt[S_j][i]}{x})$,其中SjS_j表示第jj个字符串,xx表示rand()rand()参数,cnt[Sj][i]cnt[S_j][i]表示SjS_j的哈希值中ii出现的次数。复杂度O(NMx)O(NMx)

    可以通过subtask 2subtask \ 2,预期得分7070分。

    算法3:

    单独考虑一个字符串,下标从11开始。

    设当前的base=bbase=bf[n]f[n]表示SS哈希到第nn位的值。则有转移f[n]=bf[n1]+S[n]f[n]=b*f[n-1]+S[n]。那么我们会发现f[S]f[\left| S \right|]是一个关于bb的多项式函数,设为G(b)G(b)。容易知道G(b)=i=1SS[i]bniG(b)=\sum ^{\left| S \right|}_{i=1} S[i]*b^{n-i}

    那么我们求的是G(0),G(1)G(x1)G(0),G(1) \dots G(x-1)。可以用多项式多点求值做,复杂度O(NSlog2S),S=2log max(M,x)O(NSlog^2S),S=2^{\lceil log \ max(M,x) \rceil}

    可以通过subtask 3subtask \ 3,预期得分100100分。

    嗯..这是p=998244353p=998244353的做法,下调成了4096140961是我出锅了。

    如果是现在的p=65537p=65537还有一种很快的算法,就是将长度MM强行设为6553665536后用一遍DFTDFT带入求值。

    因为(p1)M=1\frac{(p-1)}{M}=1,所以做完DFTDFT后数组里第ii位是G(gi)G(g^i),然后gig^i遍历11~p1p-1,所以最后再加上G(0)G(0)即可...比多点求值快不知道哪去了

    • 1

    信息

    ID
    3171
    时间
    1000~4500ms
    内存
    188MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者