[HNOI2008]GT考试(luogu)

  • Description

求有多少个n位的数字串不包含m位的字符串(范围 n <= 1e9 n<=1e9, m <= 20m<=20)

  • Solution

f[i][j]表示以数字串i位结尾有j个匹配的字符

g[i][j]表示从i个字符匹配到j个字符匹配的方案数

dp方程如下:

f[i][j]=f[i-1][k]*g[k][j] (0<=k<m)

发现g数组可以用kmp预处理出来,然后上矩阵乘法

  • Code
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #define ll long long
  5. using namespace std;
  6. const int N=;
  7. ll n,p,g[N][N],d[N][N],pre[N][N];
  8. int m,nxt[N];
  9. char s[N];
  10. void mul1()
  11. {
  12. memset(pre,,sizeof(pre));
  13. for(int i=;i<m;i++)
  14. for(int j=;j<m;j++)
  15. for(int k=;k<m;k++)
  16. pre[i][j]=(pre[i][j]+g[i][k]*g[k][j])%p;
  17. for(int i=;i<m;i++)
  18. for(int j=;j<m;j++)
  19. g[i][j]=pre[i][j]%p;
  20. }
  21. void mul2()
  22. {
  23. memset(pre,,sizeof(pre));
  24. for(int i=;i<m;i++)
  25. for(int j=;j<m;j++)
  26. for(int k=;k<m;k++)
  27. pre[i][j]=(pre[i][j]+d[i][k]*g[k][j])%p;
  28. for(int i=;i<m;i++)
  29. for(int j=;j<m;j++)
  30. d[i][j]=pre[i][j]%p;
  31. }
  32. void ksm(ll x)
  33. {
  34. while(x)
  35. {
  36. if(x&) mul2();
  37. mul1(),x>>=;
  38. }
  39. }
  40. int main()
  41. {
  42. scanf("%lld%d%lld",&n,&m,&p);
  43. scanf("%s",s+);
  44. nxt[]=;
  45. int k=;
  46. for(int i=;s[i];i++)
  47. {
  48. while(k> && s[k+]!=s[i]) k=nxt[k];
  49. if(s[k+]==s[i]) k++;
  50. nxt[i]=k;
  51. }
  52. for(int i=;i<m;i++)
  53. for(int j=;j<=;j++)
  54. {
  55. char wh=''+j;
  56. int k=i;
  57. while(k && s[k+]!=wh) k=nxt[k];
  58. if(s[k+]==wh) k++;
  59. if(k<m) g[i][k]++;
  60. }
  61. for(int i=;i<m;i++) d[i][i]=;
  62. ksm(n);
  63. ll ans=;
  64. for(int i=;i<m;i++)
  65. ans=(ans+d[][i])%p;
  66. printf("%lld\n",ans%p);
  67. return ;
  68. }

[HNOI2008]GT考试(kmp,dp,矩阵乘法)的更多相关文章

  1. [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)

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

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

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

  3. 【BZOJ】1009: [HNOI2008]GT考试(dp+矩阵乘法+kmp+神题)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 好神的题orzzzzzzzzzz 首先我是连递推方程都想不出的人...一直想用组合来搞..看来 ...

  4. 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂

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

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

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

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

    题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...

  7. 洛谷P3193 [HNOI2008]GT考试 kmp+dp

    正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...

  8. 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法

    [BZOJ1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的 ...

  9. [BZOJ1009][HNOI2008]GT考试(KMP+DP)

    [不稳定的传送门 Solution dp[i][j]表示前i个字符当前匹配到不吉利串的第j个,即当前方案的后缀等于不吉利串前缀 然而由于n过大,不能直接转移,用矩阵优化 Code #include & ...

  10. 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法

    题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...

随机推荐

  1. Hibernate映射文件详解(News***.hbm.xml)二

    转自 http://blog.csdn.net/a9529lty/article/details/6454924 一.hibernate映射文件的作用: Hibernate映射文件是Hibernate ...

  2. Oracle 11g R2 for Win10(64位)的安装注意点

    一般我们在win10系统安装oracle11g或者10g及更低版本的oracle客户端时,都是无法安装,一般安装的时候会闪退.这是什么原因呢?其实很简单,win10出的时间比较晚,在oracle11g ...

  3. Perl 的内置变量$|

    $|是perl的内置变量,默认情况下是0,如果设置为非0的话,表示当前的输出不经过缓存立刻输出.相当于c语言的fflush()函数,立即刷新缓冲区. 比如你print或者write一个文件,实际是需要 ...

  4. HolidayFileDisPersonViewList.js中的一些基础

    1,CSS display 属性 使段落生出行内框: p.inline { display:inline; } none 此元素不会被显示 详细介绍:  http://www.w3school.com ...

  5. 多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

    目录 AQS的源码分析 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制. 1.条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1.链表 ...

  6. ArrayList、LinkedList、Vector、CopyOnWriteArrayList的区别和源码分析

    1. ArrayList ArrayList 是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, ...

  7. ES6异步操作之Promise

    一直以来觉得异步操作在我心头像一团迷雾,可是它重要到我们非学不可,那就把它的面纱解开吧. ES6 诞生以前,异步编程的方法,大概有下面四种. 回调函数 事件监听 发布/订阅 Promise 对象 异步 ...

  8. UI自动化和selenium相关以及八大定位

    一.UI自动化相关 1. UI自动化的本质(重点) 定位元素→操作元素→模拟页面操作→断言→测试报告 2. 适合UI自动化的场景 UI自动化的前提条件 (1)需求不能频繁变动 (2)UI稳定(UI自动 ...

  9. 集合排序Comparable和Comparator有什么区别?

    Comparable和Comparator兄弟俩长得是真像.但是,需要注意下,使用中它们还是有不少区别的.下面,就一探究竟吧. 一.Comparator 做过集合排序的童鞋应该知道,可以使用Colle ...

  10. java序列化(一)

    今天我们来探讨一下java的序列化与反序列化.之前对此一直有概念,但是并没有真正的去测试.大家都知道,所谓的序列化就是把java代码读取到一个文件中,反序列化就是从文件中读取出对象.在网络传输过程中, ...