GT考试
比较神仙的$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考试的更多相关文章
- 全网独家MongoDB Certified DBA Associate考试认证视频
该视频意在让所有学员一次通过考试,避免重复考试而承担的巨额考试费用! 目前MongDB发展迅猛,有赶超mysql,和oracle看齐的苗头.在这个时候MongoDB也适时的推出了官方的认证考试&quo ...
- 记lrd的高二上学期第五次调研考试
河北某某中学的调研考试其实是很好玩的经历呢.可惜没有太多机会了. 背景: NOIP2016回来之后没有好好学文化课-.自习能翘就翘了,衡中特产学案自助没有好好写(说来我好像从来没被老师查到过,上课写学 ...
- 1009: [HNOI2008]GT考试
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数\(X_1X_ ...
- mysql练习题-查询同时参加计算机和英语考试的学生的信息-遁地龙卷风
(-1)写在前面 文章参考http://blog.sina.com.cn/willcaty. 针对其中的一道练习题想出两种其他的答案,希望网友给出更多回答. (0) 基础数据 student表 +-- ...
- js封装用户选项传递给Servlet之考试系统二
<%@ page language="java" import="java.util.*" contentType="text/html; ch ...
- js动态生成选项之考试系统(一)
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- 分享一个LiteDB做的简单考试系统辅助工具
凌晨,被安排在公司值班,因为台风“灿鸿”即将登陆,风力太大,办公楼,车间等重要部分需要关注.所以无聊,那就分享一下,今天给朋友临时做的一个小的考试系统辅助工具吧.其实非常小,需求也很简单,但是可以根据 ...
- CCF考试
第八次CCF考试记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四题的代码 第 ...
- PAT 1041. 考试座位号(15)
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...
- 硕士研究生入学考试复试试卷答案.tex
%该模板用于数学答题 \documentclass[UTF8]{ctexart}%[中文编码 UTF8] \usepackage{fancyhdr}%{页眉页脚页码} \pagestyle{fancy ...
随机推荐
- 使用dubbo-go搭建dubbo接口测试平台
背景 http接口测试只需要一个curl命令,但dubbo协议没有这样的现成接口测试工具.通常公司内的dubbo控制台或其他平台会集成一个dubbo接口测试工具. 调用一个dubbo接口,需要知道服务 ...
- python基础--网站推荐
Python教程 - 廖雪峰的官方网站 Python 基础教程 | 菜鸟教程 随笔分类 - 机器学习
- Math.round真的是四舍五入吗?我不这么认为
public static long round(double a) 返回最接近参数的 long.结果将舍入为整数:加上 1/2,对结果调用 floor 并将所得结果强制转换为 long 类型.换句话 ...
- ecshop 加入购物车和直接购买同时存在的方法
一.首先将直接购买的链接设置为 <a href="javascript:bool =1;addToCart({$goods.goods_id})"> bool值为1,g ...
- Java面向对象系列(14)- 接口的定义与实现
接口 普通类:只有具体实现 抽象类:具体实现和规范(抽象方法)都有 接口:只有规范!约束和实现分离 接口就是规范,定义的是一组规则,体现了现实世界中"如果你是-则必须能-"的思想. ...
- JDK1.8源码(四)——java.util.Arrays类
一.概述 1.介绍 Arrays 类是 JDK1.2 提供的一个工具类,提供处理数组的各种方法,基本上都是静态方法,能直接通过类名Arrays调用. 二.类源码 1.asList()方法 将一个泛型数 ...
- python日志loguru
文档:https://loguru.readthedocs.io/en/stable/overview.html#installation pip install loguru 使用 基本使用 ##终 ...
- python二级 第八套
第一部分 基本操作 第一题 1. 第二题 1. 字符串的索引 和列表的索引 一样使用 2. 这俩者有什么区别 3. 我的意思想说 切片 里面没有冒号 就是表示取这个索引的 字 ...
- 牛客练习赛71E-神奇的迷宫【点分治,NTT】
正题 题目链接:https://ac.nowcoder.com/acm/contest/7745/E 题目大意 给出\(n\)个点的一棵树,每个点有一个选择权重\(a_i\)(有\(\frac{a_i ...
- GDOI 2021 退役记
Day -n 时常想自己不学OI会怎样,经常畏惧自己其实没有心里想的那样有能力,去机房来麻痹自己 从 3.21 始加大频率刷题,复习以前都学会,而现在都被抛在脑后的算法 反正都要退役了,成绩也得鲜亮点 ...