[bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法
Brief Description
给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足:
这个字符串的任何一个字串都不等于给定字符串。
本题是POJ3691的弱化版本。
Algorithm Design
考察使用动态规划(递推)。
记录f[i][j]为当前已经做了i个字符,这个字符串长度为j的后缀与禁止字符串的前缀匹配,的字符串个数。
如果我们知道对于一个后缀而言加入一个字符之后可以转移到的状态我们就可以转移了。
我们可以知道KMP算法做的就是这样的事情。
又因為他满足矩阵乘法的一般方法,所以使用矩阵乘法加速。
Code
#include <cstdio>
const int maxn = 25;
int p[maxn], a[maxn][maxn], b[maxn][maxn];
int n, m, mod;
char ch[maxn];
void mul(int a[maxn][maxn], int b[maxn][maxn], int ans[maxn][maxn]) {
int tmp[maxn][maxn];
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++) {
tmp[i][j] = 0;
for (int k = 0; k < m; k++)
tmp[i][j] = (tmp[i][j] + a[i][k] * b[k][j]) % mod;
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < m; j++)
ans[i][j] = tmp[i][j];
}
}
int main() {
// freopen("input", "r", stdin);
scanf("%d %d %d", &n, &m, &mod);
scanf("%s", ch + 1);
int j = 0;
for (int i = 2; i <= m; i++) {
while (j > 0 && ch[j + 1] != ch[i])
j = p[j];
if (ch[j + 1] == ch[i])
j++;
p[i] = j;
}
for (int i = 0; i < m; i++) {
for (int j = 0; j <= 9; j++) {
int t = i;
while (t > 0 && ch[t + 1] - '0' != j)
t = p[t];
if (ch[t + 1] - '0' == j)
t++;
if (t != m)
b[t][i] = (b[t][i] + 1) % mod;
}
}
for (int i = 0; i < m; i++)
a[i][i] = 1;
while (n) {
if (n & 1)
mul(a, b, a);
mul(b, b, b);
n >>= 1;
}
int sum = 0;
for (int i = 0; i < m; i++)
sum = (sum + a[i][0]) % mod;
printf("%d\n", sum);
return 0;
}
[bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法的更多相关文章
- 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 ...
随机推荐
- performance_schema实现套路
实现中大量使用多层次嵌套预编译,大量if else,wrapper等 不建议去看这个实现 start_mutex_wait_v1 if (flag_thread_instrumentation) ...
- adb 命令模拟按键事件
转自:http://blog.csdn.net/jlminghui/article/details/39268419 例子:adb shell input keyevent 4 #这条命令相当于按了设 ...
- Ubuntu 添加中文字体
查看系统类型 cat /proc/version 查看中文字体 fc-list :lang=zh-cn 安装字体 sudo apt install -y --force-yes --no-instal ...
- Module安装
利用pip3 install numpy,代表安装了数学模块 pip3 install -U numpy,代表升级数学模块 有的时候需要升级pip本身,如上所示,直接执行pip3 install -U ...
- 简单java采集程序一
[目标任务]通过该网站采集全国的手机号码段至数据库表中 [完成过程] 1.初涉正则表达式,学会写简单的正则表达式 2.获取单个网页内容,学会java中基本的IO流 3.将获取数据插入mysql数据库表 ...
- 软工实践 - 第二十七次作业 Beta 冲刺(5/7)
队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10134471.html 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过 ...
- 进程id
我们知道怎么通过fork函数创建(或者说是复制)一个进程,但是我们要怎么样操作这个被创建出来的进程呢?那就需要用到他的进程id,所以就要获取进程id,一下提供一些获取进程id的函数和其使用方法. 1) ...
- lincode-58-四数之和
58-四数之和 给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d). 注意事项 四元组(a, b, c, d)中,需要满足a <= b &l ...
- [剑指Offer] 16.合并两个排序链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. [思路1]递归 /* struct ListNode { int val; struct Lis ...
- Impala-1
Impala相关操作上 阅读目录 序 数据库相关 表相关 系列索引 序 上一篇,我们介绍Impala的介绍及安装. 下面我们开始继续进一步的了解Impala的相关操作. 数据库相关 一:创建 ...