BZOJ_1009 GT考试

作者: Zhu8655 | 来源:发表于2015-05-27 22:11 被阅读155次

    1.题目相关

    2.思路

    比较基础的矩阵乘法加速动态规划。
    f[i][j] 表示到 i 位,且当前后缀与不吉利串匹配到第 j 位的方案数。


    其中 pre[k][j] 表示从匹配 k 位的串加一个字符后变为匹配了 j 位的方案数。
    但它的时间复杂度为 O(nm) 难以接受,所以考虑优化。
    可以观察到转移方程是一个线性齐次递推式,所以可以用矩阵乘法来加速。
    至于构造这个矩阵可以用 KMP 来进行。
    void prep() {
        int j = 0;
        for (int i = 2; i <= m; i++) {
            while (j > 0 && a[j+1] != a[i]) j = next[j];
            if (a[j+1] == a[i]) j++;
            next[i] = j;
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j <= 9; j++) {
                int k = i;
                while (k > 0 && a[k+1] != j) k = next[k];
                if (a[k+1] == j) k++;
                if (k < m) pre[i][k] = (pre[i][k]+1)%MOD;   //由i位转移到k位的方案++.
            }
        }
        mt[0][0] = 1;   //f[0][0]的方案数为1.
    }
    

    至此本题就可以在 O(logNM^3)* 的复杂度里解决。

    点击查看代码

    相关文章

      网友评论

      • 892d807c7bc8:可以再解释一下
        while (n) {
        if (n&1) mul(mt, pre, mt);
        mul(pre, pre, pre);
        n >>= 1;
        }
        吗?
        00ecfd28d69a:@潇潇暮雨子规啼 这是矩阵快速幂的主过程

      本文标题:BZOJ_1009 GT考试

      本文链接:https://www.haomeiwen.com/subject/hmmrqttx.html