【BZOJ1009】【codevs2325】GT考试,kmp+矩阵加速DP
来源:互联网 发布:淘宝搜索排行 编辑:程序博客网 时间:2024/06/06 04:41
传送门1
传送门2
写在前面:卡了我一下午的题目,讨厌矩阵乘法!
思路:
一开始觉得是kmp+容斥,想用累似数位DP的方法做,但发现讨论的东西有点麻烦,而且这样做是线性后来,当我看到题解有矩乘的时候,我有一丝弃疗的想法
a[i][j]指已经匹配不吉利串的前j个元素到匹配前i个元素的方案数(这里i,j指的是长度,不是下标),求这个的初始值可以用kmp随便搞搞,之后就可以矩阵快速幂走起,最后我们想要的答案就是由匹配0位到匹配i位的所有方案数(0<=i<m),即
初始矩阵ans为
注意:考虑到大家kmp的写法各不同,所以控制数组下标时要注意!
代码:
#include<bits/stdc++.h>using namespace std;int n,m,mod;int next[23];char s[23];struct matrix{ int map[23][23]; void clear(){memset(map,0,sizeof(map));}}a,ans;matrix mul(matrix x,matrix y){ matrix z; z.clear(); for (int i=0;i<m;i++) for (int j=0;j<m;j++) for (int k=0;k<m;k++) z.map[i][j]=(z.map[i][j]+x.map[i][k]*y.map[k][j]%mod)%mod; return z;}main(){ scanf("%d%d%d",&n,&m,&mod); scanf("%s",s); for (int i=1;i<m;i++) { int tmp=next[i]; while (tmp&&s[tmp]!=s[i]) tmp=next[tmp]; next[i+1]=tmp+(s[i]==s[tmp]); } for (int i=0;i<m;i++) for (int j='0';j<='9';j++) { int tmp=i; while (tmp&&s[tmp]!=j) tmp=next[tmp]; if (s[tmp]==j) a.map[tmp+1][i]++; else a.map[0][i]++; } for (int i=0;i<m;i++) ans.map[i][i]=1; while (n) { if (n&1) ans=mul(a,ans); n>>=1; a=mul(a,a); } int tot=0; for (int i=0;i<m;i++) tot=(tot+ans.map[i][0])%mod; printf("%d",tot%mod);}
0 0
- 【BZOJ1009】【codevs2325】GT考试,kmp+矩阵加速DP
- BZOJ1009 [HNOI2008]GT考试(KMP算法+矩阵加速dp)
- BZOJ1009 [HNOI2008]GT考试【kmp+矩阵加速DP】
- [bzoj1009][HNOI2008]GT考试(dp+矩阵加速+KMP)
- 【KMP+矩阵加速】BZOJ1009[HNOI2008]GT考试
- bzoj1009 GT考试 KMP+矩阵优化DP
- 【bzoj1009】[HNOI2008]GT考试 矩阵+kmp+DP
- [bzoj1009][kmp][DP][矩阵乘法]GT考试
- 【矩阵加速】【数论】【KMP】[BZOJ1009][HNOI2008]GT考试
- 【DP+KMP+矩阵乘法】BZOJ1009(HNOI2008)[GT考试]题解
- bzoj1009 [HNOI2008]GT考试(KMP+DP+矩阵倍增)
- 【KMP+DP+矩阵优化】BZOJ1009 [HNOI2008]GT考试
- BZOJ1009: [HNOI2008]GT考试(KMP+矩阵优化DP)
- 【BZOJ1009】GT考试(HNOI2008)-DP矩阵优化+KMP
- [矩阵乘法+KMP] BZOJ1009: [HNOI2008]GT考试
- bzoj1009[GT考试] dp+矩阵快速幂
- 【BZOJ1009】GT考试 DP
- bzoj1009 [ HNOI2008 ] -- KMP+矩阵乘法加速DP
- 02.Java 基础 - 继承
- 在Python中使用机器学习(1)—安装四库
- shell编程
- leetcode 39 Combination Sum
- Mesos shuffle service unusable in Spark1.6
- 【BZOJ1009】【codevs2325】GT考试,kmp+矩阵加速DP
- 固有値、固有ベクトル
- 论坛收录贴
- ZOJ 3946 Highway Project 优先队列dijk
- hadoop学习
- leetcode 343. Integer Break
- <jsp:include>标签 和 include 指令的比较
- 项目管理工具maven
- Python collections.defaultdict()与dict的使用和区别