比较神仙的$dp+KMP+Matrix$综合题目,比较值得一写

$0x00$:首先我打了一个爆搜

不过对正解并无任何启发。。。(逗比发言请忽略)

$0x01$:基础$dp$

状态还是比较好设的,

考虑设$f_{i,j}$表示$dp$到长串的第$i$位,匹配了短串的前缀长度为$j$时的总方案数

直接转移不大好搞,那么我们还需要一个转移数组

设$g_{k,j}$表示在 和短串匹配长度为$k$的串 后面添加一个字符,使新构成的串 和短串匹配长度为$j$,这样的字符的添加方案数

这个东西可以用$KMP$求,具体而言就是枚举每一种长度以及每一种可能的添加字符,

如果这个字符与短串不匹配,那么就跳$nxt$数组找到合法的最长匹配前缀。

那么转移为$f_{i,j}=\sum_{k=0}^{m-1} f_{i-1,k}*g_{k,j}$那么最终的答案就是$\sum_{i=0}^{m-1} f_{n,i}$,然而复杂度$O(nm^2)$直接爆炸

$0x02$:矩阵优化

我们看到这个方程式非常的像矩阵乘法,考虑矩阵加速递推,经过观察,我们发现这个$f$数组貌似可以省去,直接递推$g^n$就可以得到最后的$f_n$

这样,最后的答案就是$\sum_{i=0}^{m-1}g^n_{0,i}$,时间复杂度$O(m^3log_n)$完全可过

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 namespace AE86{
  4. 4 inline int read(){
  5. 5 int x=0,f=1;char ch=getchar();
  6. 6 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  7. 7 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;
  8. 8 }inline void write(int x,char opt='\n'){
  9. 9 char ch[20];int len=0;if(x<0)x=~x+1,putchar('-');
  10. 10 do{ch[len++]=x%10+(1<<5)+(1<<4);x/=10;}while(x);
  11. 11 for(int i=len-1;i>=0;--i)putchar(ch[i]);putchar(opt);}
  12. 12 }using namespace AE86;
  13. 13 const int NN=1e5+5;
  14. 14 int n,m,mod,nxt[NN],ans;
  15. 15 char s[25];
  16. 16 namespace Matrix{
  17. 17 struct Ma{
  18. 18 int p[25][25];
  19. 19 inline void cle(){memset(p,0,sizeof(p));}
  20. 20 inline void pre(){for(int i=0;i<m;i++)p[i][i]=1;}
  21. 21 inline void print(){for(int i=0;i<m;i++){for(int j=0;j<m;j++){cout<<p[i][j]<<" ";} cout<<endl;}}
  22. 22 };
  23. 23 inline Ma mul(Ma a,Ma b){
  24. 24 Ma c;c.cle();
  25. 25 for(int i=0;i<m;i++)
  26. 26 for(int j=0;j<m;j++)
  27. 27 for(int k=0;k<m;k++)
  28. 28 (c.p[i][j]+=1ll*a.p[i][k]*b.p[k][j]%mod)%=mod;
  29. 29 return c;
  30. 30 }
  31. 31 inline Ma qmo(Ma a,int b){
  32. 32 Ma c; c.cle(); c.pre();
  33. 33 while(b){
  34. 34 if(b&1) c=mul(c,a);
  35. 35 b>>=1; a=mul(a,a);
  36. 36 } return c;
  37. 37 }
  38. 38 inline Ma kmp(){
  39. 39 nxt[1]=0; Ma a; a.cle();
  40. 40 for(int i=2,j=0;i<=m;i++){
  41. 41 while(j && s[j+1]!=s[i]) j=nxt[j];
  42. 42 if(s[j+1]==s[i]) ++j;
  43. 43 nxt[i]=j;
  44. 44 }
  45. 45 for(int i=0;i<m;i++){
  46. 46 for(int ch='0';ch<='9';ch++){
  47. 47 int j=i;
  48. 48 while(j && s[j+1]!=ch) j=nxt[j];
  49. 49 if(s[j+1]==ch) ++j;
  50. 50 ++a.p[i][j];
  51. 51 }
  52. 52 }
  53. 53 return a;
  54. 54 }
  55. 55 }using namespace Matrix;
  56. 56 namespace WSN{
  57. 57 inline short main(){
  58. 58 n=read(); m=read(); mod=read(); scanf("%s",s+1);
  59. 59 Ma a=kmp(); a=qmo(a,n);
  60. 60 for(int i=0;i<m;i++) (ans+=a.p[0][i])%=mod;
  61. 61 write(ans);
  62. 62 return 0;
  63. 63 }
  64. 64 }
  65. 65 signed main(){return WSN::main();}

GT考试

GT考试的更多相关文章

  1. 全网独家MongoDB Certified DBA Associate考试认证视频

    该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...

  2. 记lrd的高二上学期第五次调研考试

    河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...

  3. 1009: [HNOI2008]GT考试

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

  4. mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风

    (-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...

  5. js封装用户选项传递给Servlet之考试系统二

    <%@ page language="java" import="java.util.*" contentType="text/html; ch ...

  6. js动态生成选项之考试系统(一)

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  7. 分享一个LiteDB做的简单考试系统辅助工具

    凌晨,被安排在公司值班,因为台风“灿鸿”即将登陆,风力太大,办公楼,车间等重要部分需要关注.所以无聊,那就分享一下,今天给朋友临时做的一个小的考试系统辅助工具吧.其实非常小,需求也很简单,但是可以根据 ...

  8. CCF考试

    第八次CCF考试记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四题的代码 第 ...

  9. PAT 1041. 考试座位号(15)

    每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...

  10. 硕士研究生入学考试复试试卷答案.tex

    %该模板用于数学答题 \documentclass[UTF8]{ctexart}%[中文编码 UTF8] \usepackage{fancyhdr}%{页眉页脚页码} \pagestyle{fancy ...

随机推荐

  1. key存活时间和五个类型通用的一些指令操作

    一.设置key的存活时间 1.失效后 ttl 是 -2,get返回 null : 2.不设置存活时候 ttl 返回是 -1: 二.查找指令和删除指令.重命名key.查看key类型 1.模糊查询 2.严 ...

  2. AI学习1

    什么是AI: 功能介绍:是一种应用于出版.多媒体和在线图像的工业标准矢量插画的软件,是一款非常好的矢量图形处理工具应用:标志设计.字体设计.印刷出版.海报书籍排版.专业插画.多媒体图像处理和互联网页面 ...

  3. 学习PHP中的国际化功能来查看货币及日期信息

    做为一门在世界范围内广泛使用的编程语言,国际化能力往往是衡量一个编程语言是否能够大范围流行的重要内容.特别是对于 PHP 这种以 Web 页面编程为主战场的语言来说,国际化能力更是重中之重.在 PHP ...

  4. 微信小程序生成小程序某一个页面的小程序码

    1 登录微信小程序后台,mp.weixin.qq.com 2 点击右上角工具->生成小程序码 3 填写小程序名称或appid 4 关键一步,下面页面填写用户微信号后,打开小程序到某一个页面,点击 ...

  5. Linux系列(29) - rpm包命名规则(1)

    RPM包命名规则 例如包名:httpd-2.2.15-15.el6.centsos.1.i686.rpm 软件包名-httpd 软件版本-2.2.15 发布的次数-15 el6.centos适合的Li ...

  6. javascript Date 日期格式化 formatDate, require.js 模块 支持全局js引入 / amd方式加载

    * 引入AMD加载方式: require.js CDN https://cdn.bootcss.com/require.js/2.3.5/require.js *  创建模块文件./js/util/d ...

  7. Python守护线程简述

    thread模块不支持守护线程的概念,当主线程退出时,所有的子线程都将终止,不管它们是否仍在工作,如果你不希望发生这种行为,就要引入守护线程的概念. threading模块支持守护线程,其工作方式是: ...

  8. AT4502-[AGC029C]Lexicographic constraints【二分,栈】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4502 题目大意 给出\(n\)个长度\(S\),求一个最小\(m\)表示用大小为\(m\)的字符集构造出\(n ...

  9. YbtOJ#763-攻城略池【线段树合并】

    正题 题目链接:http://www.ybtoj.com.cn/problem/763 题目大意 给出\(n\)个点的一棵树,每个\(d_i=0\)的点每秒会产生一个士兵往根节点走,走到一个节点让一个 ...

  10. 深入浅出WPF-09.Command(命令)

    命令 1)命令系统的基本元素 命令(Command),WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类 命令源(Command Source),即命令 ...