zoukankan      html  css  js  c++  java
  • [HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]

    题面

    传送门

    思路

    首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法:

    设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数

    那么显然,答案就是$sum_{i=0}^{m-1}dp[n][i]$了

    转移过程则需要用一个辅助数组:令$g[i][j]$表示模板串的前缀$i$可以转移到前缀$j$的方法数(注意它可能可以转移到很多个串)

    辅助数组的生成可以用next数组来推(模板串太短,其实暴力也是可以的)

    那么$dp[i+1][k]=dp[i][j]*g[j][k]left(j=1...m ight)$

    然后再看这题的数据范围:$nleq 10^9$

    Easy,加一个矩阵快速幂来解决上面的递推就行了

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    #define inf 1e9
    using namespace std;
    int MOD;
    struct ma{//矩阵类
        int n,m,a[25][25];
        ma(){n=m=0;memset(a,0,sizeof(a));}
        void clear(){n=m=0;memset(a,0,sizeof(a));}
    }A,B;
    void mul(ma &a,ma b){//矩阵乘法
        ma re;int i,j,k;re.n=a.n;re.m=b.m;
        for(i=0;i<=re.n;i++){
            for(k=0;k<=a.m;k++){
                if(!a.a[i][k]) continue;
                for(j=0;j<=re.m;j++){
                    re.a[i][j]=(re.a[i][j]+a.a[i][k]*b.a[k][j]%MOD)%MOD;
                }
            }
        }
        a=re;
    }
    int n,m,a[30],fail[30],f[30][10];char s[30];
    void qpow(ma &x,ma &y,int t){//快速幂
        while(t){
            if(t&1) mul(x,y);
            mul(y,y);t>>=1;
        }
    }
    int main(){
        scanf("%d%d%d",&m,&n,&MOD);
        scanf("%s",s);int i,j,k;
        for(i=0;i<n;i++) a[i]=s[i]-'0';a[n]=inf;
        fail[0]=fail[1]=0;j=0;
        for(i=1;i<n;i++){//求出next数组
            while(j&&(a[i]!=a[j])) j=fail[j];
            j+=(a[i]==a[j]);fail[i+1]=j;
        }
        for(i=0;i<n;i++){//生成转移矩阵
            for(j=0;j<10;j++){
                k=i;while(k&&a[k]!=j) k=fail[k];
                k+=(a[k]==j);
                if(k<n) B.a[i][k]+=1;
            }
        }
        B.m=B.n=A.m=n-1;A.n=0;A.a[0][0]=1;
        qpow(A,B,m);
        int ans=0;
        for(i=0;i<n;i++) ans+=A.a[0][i],ans%=MOD;
        printf("%d",ans);
    }
    
  • 相关阅读:
    springboot + mybatis-pagehelper 参数查询不分页的bug。。。
    不错位的java .class 反编译工具推荐
    git 生成ssh keys
    Spring boot 通用配置文件模板
    Shiro系列(3)
    Shiro系列(2)
    Shiro系列(1)
    updating
    前端速查手册——Note
    Java进阶知识与技术
  • 原文地址:https://www.cnblogs.com/dedicatus545/p/8902550.html
Copyright © 2011-2022 走看看