1009: [HNOI2008]GT考试

题目:传送门

题解:

   看这第一眼是不是瞬间想起组合数学???

   没错...这样想你就GG了!

   其实这是一道稍有隐藏的矩阵乘法,好题!

   首先我们可以简化一下题意:给出一个串,要求这个串不包含另一个串的方案个数

   这不是kmp吗?!(直接暴力肯定炸)

   我们可以再往DP的方面想

   f[i][j]表示长度为i的母串的后缀与子串匹配j个长度的方案数

   那么ans=Sigma(f[n][0]~f[n][m-1])

   那么我们再定义一个c[i][j]表示在子串长度为i的前缀后面加上一个数,令该前缀加上这个数所组成的新字符串与给出子串从头开始所能匹配的长度为j的方案数

   那么f[i+1][k]=f[i][j]*c[j][k]

   但是还是会炸啊!!!!!!!

   这时候怎么就想不到矩乘加速呢?!

   c数组不变,而且每次f都要乘一次,很明显可以用矩阵乘法。。。

   所以用kmp预处理矩阵就ok,但是c[i][m]不能继承,所以只能从w[i][0]继承,矩乘时就枚举0~m-1

代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
struct matrix
{
int m[][];
matrix(){memset(m,,sizeof(m));}
}ans;
char st[];
int p[];
int n,m,mod;
matrix multi(matrix a,matrix b,int n,int m,int p)//[n,m]*[m,p];
{
matrix c;
for(int i=;i<n;i++)
for(int j=;j<p;j++)
for(int k=;k<m;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
return c;
}
matrix p_m(matrix a,int b)
{
matrix sum;
for(int i=;i<m;i++)sum.m[i][i]=;
while(b)
{
if(b%==)sum=multi(sum,a,m,m,m);
a=multi(a,a,m,m,m);b/=;
}
return sum;
}
void kmp()
{
p[]=;int j;
for(int i=;i<=m;i++)
{
j=p[i-];
while(j && st[i]!=st[j+])j=p[j];
if(st[i]==st[j+])j++;
p[i]=j;
}
for(int i=;i<m;i++)
{
for(int y=;y<=;y++)
{
j=i;
while(j && st[j+]-''!=y)j=p[j];
if(st[j+]-''==y)j++;
ans.m[j][i]=(ans.m[j][i]+)%mod;
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&mod);
scanf("%s",st+);
kmp();
ans=p_m(ans,n);
int sum=;
for(int i=;i<m;i++)sum=(sum+ans.m[i][])%mod;
printf("%d\n",sum%mod);
return ;
}

bzoj1009: [HNOI2008]GT考试(kmp+矩阵乘法)的更多相关文章

  1. [bzoj1009][HNOI2008]GT考试——KMP+矩阵乘法

    Brief Description 给定一个长度为m的禁止字符串,求出长度为n的字符串的个数,满足: 这个字符串的任何一个字串都不等于给定字符串. 本题是POJ3691的弱化版本. Algorithm ...

  2. BZOJ1009: [HNOI2008]GT考试(KMP+矩阵乘法)

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

  3. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)

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

  4. BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)

    ---恢复内容开始--- 题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相 ...

  5. bzoj1009 [HNOI2008]GT考试——KMP+矩阵快速幂优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串计数DP问题啊...连题解都看了好多好久才明白,别提自己想出来的蒟蒻我... 首 ...

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

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

  7. BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法

    BZOJ_1009_[HNOI2008]GT考试_KMP+矩阵乘法 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考 ...

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

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

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

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

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

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

随机推荐

  1. 搭建一套Java开发环境以及使用eclipse从头一步步创建java项目

    一.java 开发环境的搭建 在windows 环境下怎么配置环境. 1.首先安装JDK java的sdk简称JDK ,去其官方网站下载JDK. https://www.oracle.com/tech ...

  2. mysql 全表扫描、全索引扫描、索引覆盖(覆盖索引)

    full index scan:全索引扫描,查询时,遍历索引树来获取数据行.如果数据不是密集的会产生随机IO 在执行计划中是Type列,index full table scan:通过读物理表获取数据 ...

  3. HDU 4418 高斯消元法求概率DP

    把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...

  4. Linux 0.11中write实现

    看了一下Linux 0.11版本号write的实现,首先它在标准头文件unistd.h中有定义 int write(int fildes, const char * buf, off_t count) ...

  5. MySQL事件调度器Event Scheduler

    我们都知道windows的计划任务和linux的crontab都是用来实现一些周期性的任务和固定时间须要运行的任务. 在mysql5.1之前我们完毕数据库的周期性操作都必须借助这些操作系统实现. 在m ...

  6. OSGI项目中获取文件路径

    假设想依据给定的文件名创建一个File实例,你可能会这么写: File file = new File(当前类.class.getResource("config").toURI( ...

  7. angular4(3)angular脚手架引入scss

    scss..sass....sccc...ssss...ccccc......MMP················· 先说下scss和sass的异同: SCSS 是 Sass 3 引入新的语法,其语 ...

  8. Codeforces 845C. Two TVs 思路:简单贪心算法

    题目: 题目原文链接:http://codeforces.com/contest/845/problem/C 题意:现在我们有一个电视清单,有两个电视,电视清单上有每一个节目的开始时间和结束时间. 电 ...

  9. bat脚本启动exe并打开文件后退出 + 中文乱码

    写了个脚本用于复制模板到新的cpp文件. 将脚本路径加到环境变量里,只需在cmd窗口输入“new hdu 1419”,就会自动将模板拷贝到WORK_DIR下的hdu文件夹内一个名叫"1419 ...

  10. iF.svnadmin 安装遇到的坑

    iF.svnadmin 官网:http://svnadmin.insanefactory.com/ 安装配置iF.svnadmin : http://blog.linhere.com/archives ...