[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 ...
随机推荐
- 关于C#数据类型自己的理解
电脑CUP处理程序的运行.cpu里分为一级缓存,二级缓存,还有三级缓存,之后是内存里的东西. 栈存放在一级缓存里,所以cup调用速度最快,处理起来也效率也最高,但是大小很小,能存放的东西很少. 堆存放 ...
- LeetCode 410——分割数组的最大值
1. 题目 2. 解答 此题目为 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道--最小分割分数. class Solution { public: // 若分割数组的最大值 ...
- iOS-显示日期的转换,今天,昨天,前天
+ (NSString *)stringWithDate:(NSDate *)date{ // 1.获得年月日 NSCalendar *calendar = [NSCalendar currentCa ...
- linux之shell脚本学习篇一
此文包含脚本服务请求,字符串截取,文件读写内容,打印内容换行. #!/bin/bashretMsg="";while read LINEdo echo "t ...
- systemtap没找到函数变量
为啥systemtap没找到函数 hon@station6:~/codebox/stap/net$ sudo stap -L 'kernel.function("sock_recvmsg_n ...
- 【Python】PYTHON九九乘法表
python2.7 for i in range(1,10): for j in range(1,i+1): print j,'x',i,'=',j*i,'\t', print '\n'pr ...
- [Leetcode] Anagrams 颠倒字母构成词
Given an array of strings, return all groups of strings that are anagrams. Note: All inputs will be ...
- 接到新数据库时,分析业务常用的SQL语句
USE DataBaseName--清空当前GridView显示,释放内存: SELECT GETDATE() --数据库关系图 SELECT * FROM sysdiagrams --列出所有表 S ...
- watch用法小记
By francis_hao Jun 30,2017 watch:周期性的执行一个一个程序,并全屏显示输出 概述 watch [options] command 描述 watch重复的运 ...
- Codeforces Round #526 (Div. 2) A.B
A. The Fair Nut and Elevator 题目链接:https://codeforces.com/contest/1084/problem/A 题意: 一栋房子有n层楼,同时有个电梯( ...