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

    基础 安装golang环境 Golang基础,流程控制,函数,方法,面向对象 网络编程(自己做一个简单的tcp的聊天室,websocket,http,命令行工具) 并发(可以看一下并发爬虫或者下载器的 ...

  2. python库--pandas--DataFrame

    转换    索引,迭代    运算符    功能应用,分组及窗口    计算/描述统计 重新索引/选择/标签操作    缺失数据处理    形状变换/排序/转置 组合/加入/合并    时间序列相关  ...

  3. this关键字的理解

    this理解为:当前对象 或 当前正在创建的对象 this代表所在类的当前对象的引用(地址值),即对象对自己的引用. 备注:意思方法被那个对象调用,方法中的this就代表那个对象.即谁调用,this就 ...

  4. CentOS获取公网IP

    Curl 纯文本格式输出: curl icanhazip.com curl ifconfig.me curl curlmyip.com curl ip.appspot.com curl ipinfo. ...

  5. 5.10学习总结——Activity的跳转和传值

    使用sharedpreference是对信息的存储,也可以进行传值,今天通过查找资料,学习了Activity的跳转和传值方法. 跳转 1.显示跳转 4种方法 1 2 3 4 5 6 7 8 9 10 ...

  6. 关于Container容器以及IoC注入机制的认识

    container 容器的概念: 1 container 是一个Java 所编写的程序,用于对象之间之间管理对象关系. 主要的java EE 容器如下: Java容器类包含List.ArrayList ...

  7. 有个计算机专业的学妹问我:我这个zip文件密码破解运行起来为什么内存爆了?

    1.这篇博文的由来 2.跑下错误代码,找病根 先把学妹发给我的错误代码放上,能发现他为了提高速度加了多线程的代码,很聪明哦: import zipfile import itertools from ...

  8. Jmeter扩展组件开发(7) - 自定义java请求的开发

    CODE package com.demo;import org.apache.jmeter.config.Arguments;import org.apache.jmeter.protocol.ja ...

  9. Jmeter系列(1) - 踩坑之代理服务器录制失败

    前景 Jmeter代理服务器报错信息如下.Jmeter录制不成功 解决方案 需了解 代理服务器启动后会在/bin目录生成ApacheJMeterTemporaryRootCA.crt和ApacheJM ...

  10. P4859-已经没有什么好害怕的了【容斥,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4859 题目大意 两个长度为\(n\)的序列\(a,b\)两两匹配,求\(a_i>b_i\)的组数比\(a_ ...