bzoj1009: [HNOI2008]GT考试(kmp+矩阵乘法)
1009: [HNOI2008]GT考试
题目:传送门
题解:
看这第一眼是不是瞬间想起组合数学???
没错...这样想你就GG了!
其实这是一道稍有隐藏的矩阵乘法,好题!
首先我们可以简化一下题意:给出一个串,要求这个串不包含另一个串的方案个数
这不是kmp吗?!(直接暴力肯定炸)
我们可以再往DP的方面想
f[i][j]表示长度为i的母串的后缀与子串匹配j个长度的方案数
那么ans=Sigma(f[n][0]~f[n][m-1])
那么我们再定义一个c[i][j]表示在子串长度为i的前缀后面加上一个数,令该前缀加上这个数所组成的新字符串与给出子串从头开始所能匹配的长度为j的方案数
那么f[i+1][k]=f[i][j]*c[j][k]
但是还是会炸啊!!!!!!!
这时候怎么就想不到矩乘加速呢?!
c数组不变,而且每次f都要乘一次,很明显可以用矩阵乘法。。。
所以用kmp预处理矩阵就ok,但是c[i][m]不能继承,所以只能从w[i][0]继承,矩乘时就枚举0~m-1
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct matrix
{
int m[][];
matrix(){memset(m,,sizeof(m));}
}ans;
char st[];
int p[];
int n,m,mod;
matrix multi(matrix a,matrix b,int n,int m,int p)//[n,m]*[m,p];
{
matrix c;
for(int i=;i<n;i++)
for(int j=;j<p;j++)
for(int k=;k<m;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
return c;
}
matrix p_m(matrix a,int b)
{
matrix sum;
for(int i=;i<m;i++)sum.m[i][i]=;
while(b)
{
if(b%==)sum=multi(sum,a,m,m,m);
a=multi(a,a,m,m,m);b/=;
}
return sum;
}
void kmp()
{
p[]=;int j;
for(int i=;i<=m;i++)
{
j=p[i-];
while(j && st[i]!=st[j+])j=p[j];
if(st[i]==st[j+])j++;
p[i]=j;
}
for(int i=;i<m;i++)
{
for(int y=;y<=;y++)
{
j=i;
while(j && st[j+]-''!=y)j=p[j];
if(st[j+]-''==y)j++;
ans.m[j][i]=(ans.m[j][i]+)%mod;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
scanf("%s",st+);
kmp();
ans=p_m(ans,n);
int sum=;
for(int i=;i<m;i++)sum=(sum+ans.m[i][])%mod;
printf("%d\n",sum%mod);
return ;
}
bzoj1009: [HNOI2008]GT考试(kmp+矩阵乘法)的更多相关文章
- [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法
Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...
- BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)
---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...
- bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法
BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...
- 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.. ...
- 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵
原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...
随机推荐
- 洛谷——P2822 组合数问题
https://www.luogu.org/problem/show?pid=2822 题目描述 组合数C_n^mCnm表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三 ...
- [Angular] Handle HTTP Errors in Angular with HttpErrorResponse interface
When communicating with some backend API, data travels over the network using the HTTP protocol. As ...
- 输入password登录到主界面,录入学生编号,排序后输出
n 题目:输入password登录到主界面,录入学生编号,排序后输出 n 1. 语言和环境 A.实现语言 C语言 B.环境要求 VC++ 6.0 n 2. 要求 请编写一个C语言程序.将若干学生编 ...
- vue Render scopedSlots
render 中 slot 的一般默认使用方式如下: this.$slots.default 对用 template的<slot>的使用没有name . 想使用多个slot 的话.需要对s ...
- thinkphp项目上传到github,为什么缺少很多文件
thinkphp项目上传到github,为什么缺少很多文件 问题: 把tp5项目push到码云(类似github)上,为什么没有thinkphp这个核心库? 然后我看了下码云和github上,官方的t ...
- 发送HTTP请求 -- HttpUtil
1. package com.step.utils; import java.io.IOException; import java.net.URLDecoder; import java.util. ...
- POJ 2189 枚举
题意: n头牛,p长度的道路,问至多包括c头牛的道路最长有多长. 思路: 按照题意暴力就好-- 注意边界. // by SiriusRen #include <cstdio> #inclu ...
- transient修饰符的作用
transient修饰符的作用: entity实体类: package com.baidu.entity; import com.fasterxml.jackson.annotation.JsonIg ...
- Swift学习笔记(7):函数
目录: 函数参数与返回值 参数标签和参数名称 可变参数 传入传出参数 函数类型 嵌套函数 函数是一段完成特定任务的独立代码片段,使用func标示函数名,使用->标示返回类型. ・可以为函数参数设 ...
- 向Vue实例混入plusready
(function () { var onPlusReady = function (callback, context = this) { if (window.plus) { callback.c ...