洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)
大佬讲的真吼->这里
首先考虑dp,设$f[i][j]$表示长串匹配到第$i$位,短串最多匹配到$j$位时的方案数
那么答案就是$\sum_{i=0}^{m-1}f[n][i]$
然后考虑一下dp的转移,一种是加进的新字符$i+1$与$j+1$匹配,那么$dp[i][j]$可以直接转移到$dp[i+1][j+1]$
然后如果不匹配怎么办?这种时候,有可能新串的一个后缀和短串的一个前缀有了匹配
对于这一点,我们就是要知道,对于一个匹配到长度为$j$的串,转移到$k$的串的方案,也就对于长度为$i$的串,加一个数字,能加入多少种数字,使得长度为$j$的匹配变成长度为$k$的匹配
然后这个可以用kmp计算
然后看一下dp式子$f[i][j]=\sum{k=0}^{m-1}f[i-1][k]*g[k][j]$
那这就是一个矩阵乘法了……因为$g[i][j]$是固定不变的,所以把$f[i][j]$看做一个矩阵
那么$F[i]=F[i-1]*G$
那么矩阵快速幂一下就行了
//minamoto
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=;
int f[N][],n,m,mod;
int kmp[N],match[N][];char s[N];
inline void init(){
kmp[]=-;
for(int i=;i<=m;++i){
int j=kmp[i-];
while((~j)&&s[j+]!=s[i]) j=kmp[j];
kmp[i]=j+;
}
kmp[]=;
for(int i=;i<m;++i)
for(int j='';j<='';++j){
int tmp=i;
while(s[tmp+]!=j&&tmp) tmp=kmp[tmp];
if(s[tmp+]==j) ++tmp;
if(tmp<m) ++match[i][tmp];
}
}
struct Matrix{
int g[][];
Matrix(){memset(g,,sizeof(g));}
Matrix operator *(Matrix B){
Matrix res;
for(int i=;i<m;++i)
for(int j=;j<m;++j)
for(int k=;k<m;++k)
(res.g[i][j]+=g[i][k]*B.g[k][j])%=mod;
return res;
}
}F,G;
inline Matrix ksm(Matrix A,int k){
Matrix res;
for(int i=;i<=m;++i) res.g[i][i]=;
while(k){
if(k&) res=res*A;
A=A*A,k>>=;
}
return res;
}
int main(){
// freopen("testdata.in","r",stdin);
scanf("%d%d%d%s",&n,&m,&mod,s+);
init();
F.g[][]=;
for(int i=;i<=m;++i)
for(int j=;j<=m;++j)
G.g[i][j]=match[i][j];
G=ksm(G,n);
F=F*G;
int ans=;
for(int i=;i<m;++i) (ans+=F.g[][i])%=mod;
printf("%d\n",ans);
return ;
}
洛谷P3193 [HNOI2008]GT考试(KMP,矩阵)的更多相关文章
- 洛谷P3193 [HNOI2008]GT考试 kmp+dp
正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...
- 洛谷P3193 [HNOI2008]GT考试(dp 矩阵乘法)
题意 题目链接 Sol 设\(f[i][j]\)表示枚举到位置串的第i位,当前与未知串的第j位匹配,那么我们只要保证在转移的时候永远不会匹配即可 预处理出已知串的每个位置加上某个字符后能转移到的位置, ...
- 【KMP】【矩阵加速】【递推】洛谷 P3193 [HNOI2008]GT考试 题解
看出来矩阵加速也没看出来KMP…… 题目描述 阿申准备报名参加 GT 考试,准考证号为\(N\)位数\(X_1,X_2…X_n(0\le X_i\le9)\),他不希望准考证号上出现不吉利的数 ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵
原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...
- [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法
Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...
- bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...
随机推荐
- AngularJS学习笔记(四) 自定义指令
指令(directive)是啥?简单来说就是实现一定功能的XXX...之前一直用的ng-model,ng-click等等都是指令.当我有一个ng没提供的需求的时候,就可以自定义个指令.指令的好处显而易 ...
- python-杂烩
如何从其它目录导入py文件 import sys sys.path.append("文件目录地址") from xxx import xxx
- hdu-5641 King's Phone (水题)
题目链接: King's Phone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- C++中函数重载
C++中函数重载使用顶层const修饰参数和不使用const修饰参数效果是一样的,如果定义了这样的重载函数会报函数重定义的错误. 追其原因,C++中的函数传递方式有三种,一种是值传递,就是拷贝,一种是 ...
- 1045 Favorite Color Stripe (30)(30 分)
Eva is trying to make her own color stripe out of a given one. She would like to keep only her favor ...
- centos下升级mysql5.5.47到5.7.14操作过程
一. 查看已安装Mysql基础信息通过mysql –V 查看下mysql版本可以通过命令find / -name mysql 得到下面信息 1.安装目录[root@jjxnhd-192-10 mysq ...
- jumpserver遇到的坑
安装:https://github.com/jumpserver/jumpserver,看readme照着做就行,下面是遇到的坑. 0.4.4版坑: 1.要升级pip,否则有的包装不上 2.p ...
- HDOJ5441(图论中的并查集)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; ; ...
- 【转】 Pro Android学习笔记(七二):HTTP服务(6):HttpURLConnection
目录(?)[-] Http Get的使用方式 基础小例子 Cookie的使用 重定向 HTTP POST的小例子 基础小例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载 ...
- 开发框架:AdminLTE
ylbtech-开发框架:AdminLTE 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 1. 2. 5.返回顶部 1. https://adminlte.io 2. 6.返 ...