[HNOI2008][bzoj1009] GT考试 [KMP+矩阵快速幂]
2018-04-21 17:56
477 查看
题面
传送门思路
首先,如果$n$和$m$没有那么大的话,有一个非常显然的dp做法:设$dp[i][j]$表示长度为i的字符串,最后j个可以匹配模板串前j位的情况数
那么显然,答案就是$\sum_{i=0}^{m-1}dp
[i]$了
转移过程则需要用一个辅助数组:令$g[i][j]$表示模板串的前缀$i$可以转移到前缀$j$的方法数(注意它可能可以转移到很多个串)
辅助数组的生成可以用next数组来推(模板串太短,其实暴力也是可以的)
那么$dp[i+1][k]=dp[i][j]*g[j][k]\left(j=1...m\right)$
然后再看这题的数据范围:$n\leq 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 =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); }
相关文章推荐
- BZOJ KMP+矩阵快速幂 1009: [HNOI2008]GT考试
- [KMP+矩阵快速幂加速]BZOJ 1009——[HNOI2008]GT考试
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
- BZOJ 1009:[HNOI2008]GT考试
- Bzoj1009 [HNOI2008]GT考试
- BZOJ 1009([HNOI2008]GT考试-KMP+矩阵加速Dp)
- 【BZOJ】1009: [HNOI2008]GT考试(dp+矩阵乘法+kmp+神题)
- BZOJ1009: [HNOI2008]GT考试
- BZOJ 1009 [HNOI2008]GT考试
- bzoj1009 [HNOI2008]GT考试
- [BZOJ1009][HNOI2008]GT考试
- BZOJ-1009-GT考试-HNOI2008
- BZOJ 1009 [HNOI2008]GT考试 ——矩阵乘法 KMP
- BZOJ1009 HNOI2008 GT考试
- BZOJ 1009: [HNOI2008]GT考试(DP+KMP失配+矩阵快速幂)
- [BZOJ1009][HNOI2008]GT考试(AC自动机+矩阵加速dp)
- BZOJ 1009 HNOI 2008 GT考试 AC自动机+矩阵乘法
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
- 【DP+矩阵优化】[HNOI2008][HYSBZ/BZOJ1009]GT考试
- bzoj1009 [HNOI2008]GT考试