• [BZOJ1009][HNOI2008]GT考试


    BZOJ
    Luogu
    GT考试=搞颓考试

    sol

    先考虑(O(nm))的转移。设(f_{i,j})表示填了(i)个数,当前在(AC)自动机上编号为(j)的节点上的方案数。
    发现每次从(f_i)转移到(f_{i+1})的转移都是一样的,所以可以矩阵快速幂优化(DP)转移,复杂度(O(m^3log{n}))

    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    using namespace std;
    const int N = 100;
    int n,m,mod,tot,len,ch[26][N],fail[N],frb[N],ans;
    char s[N];
    queue<int>Q;
    struct matrix{
        int a[N][N];
        matrix(){memset(a,0,sizeof(a));}
        int *operator [](int x){return a[x];}
        matrix operator * (matrix b)
            {
                matrix c;
                for (int i=0;i<=tot;i++)
                    for (int j=0;j<=tot;j++)
                        for (int k=0;k<=tot;k++)
                            (c[i][k]+=1ll*a[i][j]*b[j][k]%mod)%=mod;
                return c;
            }
    }S,T;
    void Insert()
    {
        scanf("%s",s);len=strlen(s);
        int x=0;
        for (int i=0;i<len;i++)
            x=ch[s[i]-'0'][x]=++tot;
        frb[x]=1;
    }
    void Get_Fail()
    {
        for (int i=0;i<10;i++) if (ch[i][0]) Q.push(ch[i][0]);
        while (!Q.empty())
        {
            int u=Q.front();Q.pop();
            for (int i=0;i<10;i++)
                if (ch[i][u]) fail[ch[i][u]]=ch[i][fail[u]],Q.push(ch[i][u]);
                else ch[i][u]=ch[i][fail[u]];
            frb[u]|=frb[fail[u]];
        }
    }
    int main()
    {
        scanf("%d %d %d",&n,&m,&mod);
        Insert();
        Get_Fail();
        for (int i=0;i<=tot;i++)
            if (!frb[i])
                for (int j=0;j<10;j++)
                    if (!frb[ch[j][i]])
                        T[i][ch[j][i]]++;
        S[0][0]=1;
        while (n)
        {
            if (n&1) S=S*T;
            T=T*T;n>>=1;
        }
        for (int i=0;i<=tot;i++) (ans+=S[0][i])%=mod;
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    Flex 医疗行程图
    java cmd 命令
    面向对象的ExtJS场景开发
    spring Integration服务总线

    Vue.js 渲染函数, JSX(未掌握,未学完)
    JavaScript--Array; Array.prototype
    Vue.js 响应式原理
    Turbolinks
    LINQ 操作符
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8350109.html
Copyright © 2020-2023  润新知