BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)
Description
阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。
他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为
0
Input
第一行输入N,M,K.接下来一行输入M位的数。 N<=10^9,M<=20,K<=1000
Output
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.
Sample Input
111
Sample Output
解题思路:
首先,确定一下什么样的数字中没有不吉利数字。
1.这个数字的前缀不是不吉利数字(废话)
2.这个数字中间不包含不吉利数字(废话)
3.这个数字的后缀不是不吉利数字(废话)
那么,这个数字如果是像汉堡那样一层一层堆的话,我们可以通过尽可能阻止不吉利数字出现来完成任务。
假设数字串出现到了第 i 位,只要后缀m-1位不是不吉利数字m-1位就可以。
所以设f[i][j]为数字堆积到 i 而匹配出来了 j 位。
那么 :

a[k][j]为预处理出来的结果,其概念为:
原串中匹配到 j 时 k 位是否可以被枚举,由于做到不重不漏地计数,每次取前一个next即可
最后由于运算简单但递推长度大,使用矩阵乘法即可。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
int n,m;
lnt K;
char num[];
int nxt[];
struct squ{
lnt s[][];
squ friend operator * (squ x,squ y)
{
squ ans;
for(int i=;i<m;i++)
{
for(int j=;j<m;j++)
{
ans.s[i][j]=;
for(int k=;k<m;k++)
{
ans.s[i][j]=(ans.s[i][j]+x.s[i][k]*y.s[k][j])%K;
}
}
}
return ans;
}
squ friend operator ^ (squ x,lnt y)
{
squ ans=x;
y--;
while(y)
{
if(y&)
ans=ans*x;
x=x*x;
y=y/;
}
return ans;
}
}f,g;
int main()
{
scanf("%d%d%lld",&n,&m,&K);
scanf("%s",num+);
nxt[]=nxt[]=;
for(int i=,j=;i<=m;i++)
{
while(j&&num[i]!=num[j+])
j=nxt[j];
if(num[i]==num[j+])
j++;
nxt[i]=j;
}
for(int k=;k<m;k++)
{
for(int j=;j<;j++)
{
int i=k;
while(i&&num[i+]!=j+'')
i=nxt[i];
if(num[i+]==j+'')
i++;
if(i!=m)
g.s[i][k]=(g.s[i][k]+)%K;
}
}
f=g^n;
lnt ans=;
for(int i=;i<m;i++)
{
ans=(ans+f.s[i][])%K;
}
printf("%lld\n",ans);
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&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 ...
随机推荐
- Vue进阶之事件处理器
过滤 <html> <head> <meta charset="UTF-8"> <meta name="viewport&quo ...
- poj--3281-- DiningI(最大流)
Dining Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status ...
- 11.ng-init
转自:https://www.cnblogs.com/best/tag/Angular/ 初始化 <p ng-init="test=1" ng-repeat="a ...
- Coderfroces 864 E. Fire(01背包+路径标记)
E. Fire http://codeforces.com/problemset/problem/864/E Polycarp is in really serious trouble — his h ...
- CentOS7 PXE安装批量安装操作系统
1.安装相关软件 yum -y install tftp-server httpd dhcp syslinux 2.配置DHCP cp /usr/share/doc/dhcp-4.2.5/dhcpd. ...
- jQuery判断字符串是否含有中文字符
//判断字符串是不是中文String.prototype.isChinese = function () { var reg = /[^\x00-\xff]/ig;//判断是否存在中文和全角字符 ...
- 错误:created a ThreadLocal with key of type ……but failed to remove it when the web application was stopped. This is very likely to create a memory leak.
tomcat reload显示错误:SEVERE: The web application [/Interceptor] created a ThreadLocal with key of type ...
- POJ 1014 Dividing 背包
二进制优化,事实上是物体的分解问题. 就是比方一个物体有数量限制,比方是13,那么就须要把这个物体分解为1. 2, 4, 6 假设这个物体有数量为25,那么就分解为1, 2, 4. 8. 10 看出规 ...
- 蓝的成长记——追逐DBA(10):飞刀防身,熟络而非专长:摆弄中间件Websphere
原创作品,出自 "深蓝的blog" 博客.欢迎转载,转载时请务必注明出处.否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong ...
- 从头认识java-13.12 超类通配符
这一章节我们来讨论一下超类通配符. 1.什么是超类通配符 在前一章节我们提到一种通配符,是使用<? extends XXX>来实现的,导致了后面的一系列问题,如今我们引入还有一种通配符-- ...