题目链接

设f[i][j]为当前是第i位考号、现在匹配到第j位(已有j-1位和A[]匹配)的方案数

因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0,那么设由匹配j位转移到匹配k位的方案数为t[j][k]

那么 \(f[i][j] = ∑f[i-1][k]*t[k][j]\)

这个式子是线性的,于是可以先计算出t矩阵的n次幂,最后乘以初始矩阵

t矩阵枚举当前匹配多少位后,枚举下次选择的数即可,利用KMP计算现在匹配的位数

//824kb	24ms
#include <cstdio>
#include <cstring>
const int N=23; int n,m,mod,fail[N];
char s[N];
struct Matrix
{
int A[N][N];
Matrix operator *(const Matrix &a)const
{
Matrix res;
for(int i=0; i<m; ++i)
for(int j=0; j<m; ++j)
{
res.A[i][j]=0;
for(int k=0; k<m; ++k)
res.A[i][j]+=A[i][k]*a.A[k][j];
res.A[i][j]%=mod;
}
return res;
}
void Print()
{
for(int i=0; i<m; ++i,putchar('\n'))
for(int j=0; j<m; ++j) printf("%d ",A[i][j]);
putchar('\n');
}
}t,ans; void Get_Fail()
{
// fail[0]=fail[1]=0;
for(int j,i=1; i<m; ++i)
{
j=fail[i];
while(j && s[i]!=s[j]) j=fail[j];
fail[i+1]= s[i]==s[j]?j+1:0;
}
}
Matrix FP(Matrix x,int k)
{
Matrix t=x; --k;
for(; k; k>>=1,x=x*x)
if(k&1) t=t*x;
return t;
} int main()
{
scanf("%d%d%d%s",&n,&m,&mod,s);
Get_Fail();
for(int i=0; i<m; ++i)//当前匹配到第i位
for(int k,j='0'; j<='9'; ++j)//选择下一位
{
k=i;
while(k && s[k]!=j) k=fail[k];
if(s[k]==j) ++k;//第k位能匹配,转移到k+1位
if(k!=m) ++t.A[i][k]/*,t.A[i][k]>=mod?t.A[i][k]-=mod:0*/;//匹配完m位,不能加(虽然加上也不至于错)
}
ans.A[0][0]=1;//初始: f[0][0]=1
ans=ans*FP(t,n);
int res=0;
for(int i=0; i<m; ++i) res+=ans.A[0][i];//实际上ans是一个1*n的矩阵,与t(n*n)相乘后即1*n的矩阵,所以行还应是0
printf("%d",res%mod); return 0;
}

BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)的更多相关文章

  1. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  2. BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法

    标题效果:给定的长度m数字字符串s.求不包括子s长度n数字串的数目 n<=10^9 看这个O(n)它与 我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案 例如,当 ...

  3. BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4266  Solved: 2616[Submit][Statu ...

  4. bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...

  5. 题解:BZOJ 1009 HNOI2008 GT考试 KMP + 矩阵

    原题描述: 阿申准备报名参加GT考试,准考证号为N位数 X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0<=Ai&a ...

  6. $bzoj1009-HNOI2008$ $GT$考试 字符串$dp$ 矩阵快速幂

    题面描述 阿申准备报名参加\(GT\)考试,准考证号为\(N\)位数\(x_1,x_2,...,x_n\ (0\leq x_i\leq 9)\),他不希望准考证号上出现不吉利的数字. 他的不吉利数字\ ...

  7. bzoj1009: [HNOI2008]GT考试 ac自动机+矩阵快速幂

    https://www.lydsy.com/JudgeOnline/problem.php?id=1009 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9 ...

  8. BZOJ 2004 公交线路(状压DP+矩阵快速幂)

    注意到每个路线相邻车站的距离不超过K,也就是说我们可以对连续K个车站的状态进行状压. 然后状压DP一下,用矩阵快速幂加速运算即可. #include <stdio.h> #include ...

  9. bzoj 1898: [Zjoi2005]Swamp 沼泽鳄鱼【dp+矩阵快速幂】

    注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 #include ...

随机推荐

  1. 【Python】批量查询-提取站长之家IP批量查询的结果v1.0

    0 前言 写报告的时候为了细致性,要把IP地址对应的地区给整理出来.500多条IP地址找出对应地区复制粘贴到报告里整了一个上午. 为了下次更好的完成这项重复性很高的工作,所以写了这个小的脚本. 1 使 ...

  2. python2.7源码或第三方包里埋藏的坑(持续更新)

    1.psutil包,aix环境下,如果进程命令过长的话,程序无法取得完整的进程命令,测试代码如下 import psutil proc=psutil.Process(11534558) pidDict ...

  3. elk系统通过nginx添加对kibana的登录认证

    elk系统添加对kibana的登录认证 关于elk系统的安装配置可以参考:Centos6.5安装Logstash ELK stack 日志管理系统及使用详解 http://blog.csdn.net/ ...

  4. Bootstrap报错:Bootstrap's JavaScript requires jQuery

    如题,经百度原来导入顺序的问题,须要先导入Jqeury库,今记之!

  5. Android判断网络是否打开,并打开设置网络界面

    由于Android的SDK版本不同所以里面的API和设置方式也是有少量变化的,尤其是在Android 3.0 及后面的版本,UI和显示方式也发生了变化,现在就以打开网络设置为例,同大家分享一下: 1. ...

  6. Android用户界面开发:Fragment

    Android用户界面开发:Fragment 1:注意事项  3.0以前的Android 版本要使用FragmentActivity 来装载Fragment ,使用到support v4包.  3.0 ...

  7. javascript判断是用什么设备打开

    var userAgentInfo = navigator.userAgent //查看浏览器用于 HTTP 请求的用户代理头的值 var agents = ["Android", ...

  8. UVA101 【The Blocks Problem】

    一个大模拟!!! 总的来说就是碰到move就要把a上面的全部放回原处. 如果碰到onto就要把b上面的全部放到原处. 因为move是只移动a一个,所以a上面的要归位,而pile是移一堆,所以不用. o ...

  9. Renderscript图像处理

    作者:慧能 最近正在学习renderscript,后期会整理一篇完整的文档,先记着.... https://blog.csdn.net/codemydream/article/details/5346 ...

  10. Lavarel - 模块间复用代码

    代码复用在项目中早晚会遇到,这不在用 Laravel 给博客增加 Feed 订阅功能 就到了需要将生成网页 description 的函数提取出来,在文章显示与 Feed 生成的两个 Controll ...