1 solutions

  • 0
    @ 2025-11-14 18:01:34

    题解

    ​ 对于字典树中任意一个节点,其最多有26个子节点(26个字母);

    设i为当前层数,maxNode[i]为i层最多节点数,对每层分开讨论;

    k层取得最多节点时,必定k-1层每个节点都有26个子节点且k-1层满节点,此时maxNode[k]=maxNode[k-1]*26,因为第0层有1个节点,所以

    maxNode[1]=maxNode[0]*26=26,我们可以推出maxNode[k]=26k 26^k

    当有n个长度为m的字符时,第k层我们实际能给多少节点呢?答案是n个。当n<=maxNode[k]n<=maxNode[k]时,我们取n。当n>maxNode[k]时,我们取maxNode[k];

    所以每一层ans+=min(n,maxNode[k])min(n,maxNode[k])

    贴出一个错误代码

        for (int i = 0; i <= m; i++)
        {
                ans1 = (min((int)pow(26, i), n) + ans1) % mod;
        }
    

    为什么不这样写呢?因为pow(26,i)pow(26,i),i可以取到1e5,肯定会有溢出的情况,所以肯定不能全写pow(26,i);

    让我们再看看这个式子min(n,maxNode[k])min(n,maxNode[k]),并思考n<1e5n<1e5!!!!!!!,我们可以试出26426^4<1e5<26526^5(当然也可以写个代码找),也就是说k>=5时,maxNode[k]永远大于n,我们永远只取n,

    这里贴出核心代码

        for (int i = 0; i <= m; i++)
        {
            if (i <= 5)
                ans1 = (min((int)pow(26, i), n) + ans1) % mod;
            else
                ans1 = (ans1 + n) % mod;
        }
    

    Information

    ID
    7099
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    2
    Tags
    (None)
    # Submissions
    4
    Accepted
    2
    Uploaded By