题目链接

设f[i][j]为当前是第i位考号、现在匹配到第j位(已有j-1位和A[]匹配)的方案数

因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0,那么设由匹配j位转移到匹配k位的方案数为t[j][k]

那么 \(f[i][j] = ∑f[i-1][k]*t[k][j]\)

这个式子是线性的,于是可以先计算出t矩阵的n次幂,最后乘以初始矩阵

t矩阵枚举当前匹配多少位后,枚举下次选择的数即可,利用KMP计算现在匹配的位数

  1. //824kb 24ms
  2. #include <cstdio>
  3. #include <cstring>
  4. const int N=23;
  5. int n,m,mod,fail[N];
  6. char s[N];
  7. struct Matrix
  8. {
  9. int A[N][N];
  10. Matrix operator *(const Matrix &a)const
  11. {
  12. Matrix res;
  13. for(int i=0; i<m; ++i)
  14. for(int j=0; j<m; ++j)
  15. {
  16. res.A[i][j]=0;
  17. for(int k=0; k<m; ++k)
  18. res.A[i][j]+=A[i][k]*a.A[k][j];
  19. res.A[i][j]%=mod;
  20. }
  21. return res;
  22. }
  23. void Print()
  24. {
  25. for(int i=0; i<m; ++i,putchar('\n'))
  26. for(int j=0; j<m; ++j) printf("%d ",A[i][j]);
  27. putchar('\n');
  28. }
  29. }t,ans;
  30. void Get_Fail()
  31. {
  32. // fail[0]=fail[1]=0;
  33. for(int j,i=1; i<m; ++i)
  34. {
  35. j=fail[i];
  36. while(j && s[i]!=s[j]) j=fail[j];
  37. fail[i+1]= s[i]==s[j]?j+1:0;
  38. }
  39. }
  40. Matrix FP(Matrix x,int k)
  41. {
  42. Matrix t=x; --k;
  43. for(; k; k>>=1,x=x*x)
  44. if(k&1) t=t*x;
  45. return t;
  46. }
  47. int main()
  48. {
  49. scanf("%d%d%d%s",&n,&m,&mod,s);
  50. Get_Fail();
  51. for(int i=0; i<m; ++i)//当前匹配到第i位
  52. for(int k,j='0'; j<='9'; ++j)//选择下一位
  53. {
  54. k=i;
  55. while(k && s[k]!=j) k=fail[k];
  56. if(s[k]==j) ++k;//第k位能匹配,转移到k+1位
  57. if(k!=m) ++t.A[i][k]/*,t.A[i][k]>=mod?t.A[i][k]-=mod:0*/;//匹配完m位,不能加(虽然加上也不至于错)
  58. }
  59. ans.A[0][0]=1;//初始: f[0][0]=1
  60. ans=ans*FP(t,n);
  61. int res=0;
  62. for(int i=0; i<m; ++i) res+=ans.A[0][i];//实际上ans是一个1*n的矩阵,与t(n*n)相乘后即1*n的矩阵,所以行还应是0
  63. printf("%d",res%mod);
  64. return 0;
  65. }

BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)的更多相关文章

  1. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  2. BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法

    标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...

  3. BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4266  Solved: 2616[Submit][Statu ...

  4. bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...

  5. 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵

    原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...

  6. $bzoj1009-HNOI2008$ $GT$考试 字符串$dp$ 矩阵快速幂

    题面描述 阿申准备报名参加\(GT\)考试,准考证号为\(N\)位数\(x_1,x_2,...,x_n\ (0\leq x_i\leq 9)\),他不希望准考证号上出现不吉利的数字. 他的不吉利数字\ ...

  7. bzoj1009: [HNOI2008]GT考试 ac自动机+矩阵快速幂

    https://www.lydsy.com/JudgeOnline/problem.php?id=1009 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9 ...

  8. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  9. bzoj 1898: [Zjoi2005]Swamp 沼泽鳄鱼【dp+矩阵快速幂】

    注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 #include ...

随机推荐

  1. caffe-win10-cifar10另

    上一篇主要以bat形式实现了leveldb形式的cifar10,因为对于shell脚本不甚熟悉,所以这次专门利用.sh调用来实现lmdb形式的cifar10. 1.下载数据 同上一篇. 2.数据转换和 ...

  2. register 用法注意与深入--【sky原创】

    register 用法注意与深入:   gcc -o test  test.c   这样编译的话会报错的,因为寄存器变量是不能取地址的,只有内存的变量才能取地址 寄存器变量取的是虚拟地址   #inc ...

  3. 通过htaccess文件配置多个一级域名指向根目录的子文件夹

    创建.htaccess文件,在Windows系统创建时要写成“.htaccess.”,不带双引号,否则不会创建成功. <IfModule mod_rewrite.c> Options +F ...

  4. Qt Excel

    在pro文件添加 QT +=axcontainer 头文件 #include <QAxObject> void MainWindow::on_btnSelectFileDialog_cli ...

  5. 浏览器桌面通知Notification实践

    一言不合就上图: 最近常常在浏览器看到这样的消息推送,还有QQ.com的推送,现在我对这个不了解,不知道叫消息自动推送对不对,这个时chrome浏览器的截图,出现在右下角,其他浏览器的样式可能有些微差 ...

  6. Python源码学习(一)

    考虑到性能的要求,我在工作中用的最多的是c/c++,然而,工作中又经常会有一些验证性的工作,这些工作对性能的要求并不高,反而对完成的效率要求更高,对于这样的工作,用一种开发效率高的语言是合理的想法,鉴 ...

  7. webpack 3之hash、chunkhash和contenthash三者的区别

    在使用webpack 3中,文件名的hash值可以有三种hash生成方式,那具体使用哪一种呢? 1.hash 如果都使用hash的话,所有文件的hash都是一样的,而且每次修改任何一个文件,所有文件名 ...

  8. 如何设置font-family

    第一部分: 根据font-family的原则,假如客户终端不认识前面的字体,就自动切换到第二种字体,第二种不认识就切换到第三种,以此类推.假如都不能识别就调用默认字体 根据font-family的字体 ...

  9. Oracle学习笔记--第3章 使用sql*plus工具

    使用sql*plus工具 1.sqlplus连接方式示例 sqlplus system/123[as sysdba]; 2.查看表结构命令;desc[ribe] e.g.      desc scot ...

  10. C# int可以表示的最大值

    C#中int由4个字节组成,即由32个二进制数组成,由于最高位是用于表示正负数,所以实际上int所能表示的最大数为231-1=2147483647.