题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵
原题描述:
阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。他的不吉利数学A1A2...Am(0<=Ai& lt;=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为0
分析:
吐槽:这道题的细节问题差点坑死我。
一开始这道题想了个DP,但是状态转移太恶心。
那我们换一个思路,先用KMP构造出A的一个自动机。
然后这道题就转化成了在自动机上跑啊跑,跑N条边都没跑到终态(Am)的路径数。
这样,我们就把这道题转化成了一个经典问题:在一个有向图上,从s到t,经过N条边的路径数。
矩阵快速幂即可解决。
不会做的个经典问题的话,请看下面的讲解:
/*
这个问题我们可以用DP解决,方程为:
DP[i][j][k] = DP[i][p][k - 1] * DP[p][j][k - 1];
然后,显然,我们可以利用滚动数组。
DP[i][j] = DP[i][p] * DP[p][j];
然后,然后,你发现了什么?
这不是矩阵乘法么!
*/
具体实现过程:
1. 求得A的Next数组。
2. 根据转移图构造矩阵M:i能转移到j则,M[i][j] ++;
(由于Am是终态,所以可以不向Am连边,常数优化)
3. C = M ^ n;
4. 答案为for(int I = 0;I < m;I ++) ans +=C[0][i];
ACCode:
#include <cstdio>
#include <cstring>
using namespace std; int N,M,K; const int maxm = 30; struct Matrix
{
int a[maxm][maxm],n;
Matrix(int n,int x) : n(n)
{
for(int i = 0;i < n;i ++) for(int j = 0;j < n;j ++) a[i][j] = i == j ? x : 0;
}
Matrix operator * (const Matrix &b)
{
Matrix c(n,0);
for(int i = 0;i < n;i ++)
for(int j = 0;j < n;j ++)
for(int k = 0;k < n;k ++)
(c.a[i][j] += ((a[i][k] * b.a[k][j]) % K)) %= K;
return c;
}
}; Matrix pow_mod(Matrix &a,int b)
{
Matrix c(a.n,1);
for(; b ;b >>= 1)
{
if(b & 1) c = c * a;
a = a * a;
}
return c;
}
int A[maxm],f[maxm];
Matrix m(maxm,0); void getNext()
{
for(int i = 1;i < M;i ++)
{
int j = f[i];
while(j && A[i] != A[j]) j = f[j];
f[i + 1] = A[i] == A[j] ? j + 1 : 0;
}
} char str[maxm]; int main()
{
scanf("%d%d%d\n%s",&N,&M,&K,str);
for(int i = 0;i < M;i ++) A[i] = str[i] - '0';
getNext();
m.n = M;
for(int i = 0;i < M;i ++)
for(int j = 0;j < 10;j ++)
{
int k = i;
if(A[i] == j) m.a[i][i + 1] ++;
else
{
while(k && A[k] != j) k = f[k];
if(A[k] == j) k ++;
m.a[i][k] ++;
}
}
Matrix c = pow_mod(m,N);
int ans = 0;
for(int i = 0;i < M;i ++) (ans += c.a[0][i]) %= K;
printf("%d\n",ans);
return 0;
}
题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵的更多相关文章
- 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+矩阵优化dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)
---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...
- BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)
题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
随机推荐
- Ubuntu---VIM 常用命令
今天学习 VIM 的一些常用命令,向传说中的“最后一个编辑器”进攻,哈哈 插入命令: # insert i : 当前光标之前插入 I : 在此行的行首插入 o : 在下一行新起一行插入 O : 在上一 ...
- Python上楼梯
假设一段楼梯共n(n>1)个台阶,小朋友一步最多能上3个台阶,那么小朋友上这段楼梯一共有多少种方法. (小朋友真的累,我选择电梯) 大体思路用到了递归,假如说楼梯有12阶,那么11阶时有只有一种 ...
- cocoaPods安装使用亲体验
一. cocoaPods的安装. 终端中输入: $ sudo gem install cocoapods 注意:直接在terminal中输入这个是安装不成功的,因此,我们可以通过淘宝的Ruby镜像来访 ...
- mysql统计指定数据库的各表的条数
mysql统计指定数据库的各表的条数 SELECT table_schema,table_name,table_rows,CREATE_TIME FROM TABLES WHERE TABLE_SCH ...
- Java实现卖票程序(两种线程实现)
/** * 2019年8月8日16:05:05 * 目的:实现火车站卖票系统(第一种创建线程的方式) * @author 张涛 * */ //第一种方式直接继承Thread来创建线程 class T1 ...
- 大厂面试题:今天复试百度PHP工程师
今天下午来到北京百度科技园进行复试PHP工程师岗位. 面试官问了很多问题,我大概整理回忆下: 1.Redis秒杀实现? redis队列解决抢购高并发的原理: 在程序跟数据库之前呢我们可以利用redis ...
- mysql绿色版小白简易安装教程
第一步,解压并安装mysql 我们先解压整个安装包 然后进入解压后的安装包 复制安装包路径 然后按Windows键,打开"开始",输入cmd 接着以管理员方式打开cmd 如图 接着 ...
- VBA引用管理加载宏
下载文件: VBA引用管理加载宏.rar 下载后,解压缩. Excel的 开发工具/加载项 在对话框中浏览 VBA引用管理.xlam VBA界面中,在工程右键菜单中出现:
- MySQL的详细操作
MySQL的详细操作 存储引擎 不同的数据应该有不同的处理机制 mysql存储引擎 Innodb:默认的存储引擎 查询速度较myisam慢 但是更安全,支持事务,行锁,外键由于以上的支持,数据更安全, ...
- 关于正则表达式 g,m 参数的总结,为了回答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”
为了解答“正则表达式(/[^0-9]/g,'')中的"/g"是什么意思?”这个问题,也为了能够便于大家对正则表达式有一个更为综合和深刻的认识,我将一些关键点和容易犯糊涂的地方再系统 ...