---恢复内容开始---

题目大意:给定一个由数字构成的字符串A(len<=20),让你选择一个长度为n(n是给定的)字符串X,一个合法的字符串X被定义为,字符串X中不存在任何一段子串与A完全相同,求互不相同的合法的字符串L的数量

第一眼看就没啥思路....瞅了一眼题解,是KMP优化DP,然后再用矩阵优化DP

思路还是不难的,首先用KMP求出原字符串的next数组,再用next转移

定义f[i][j]是当前X串匹配到了第i位,已经匹配到了字符串A的第j位

每次在X串的第j+1位填上一个数c,那么X串现在最长能匹配上A串的位置

就是从第j+1位一直往前跳next,直到碰到一个位置a[k]==a[j]或k==0也匹配不到

 int k=i+;
for(k=i+;k>&&a[k]!=c;k=nxt[k])
;
pw.mp[k][i]++;

这是一个连续的过程,上面是构建矩阵的核心代码(原来的代码太丑了我改了一下)

至于为什么要这么跳呢,这是一个类似于"贪心"的过程,但并不是我们主动去贪心

因为我们要保证每次转移的位置都是正确的

然后发现N<=1e9有点大,矩阵乘法优化一下即可

 #include <map>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define N 23
#define ui unsigned int
#define inf 0x3f3f3f3f
using namespace std;
//re
int n,len;
ui mod;
char str[N];
int a[N],nxt[N];
struct mtx{
ui mp[N][N];
friend mtx operator *(const mtx &s1,const mtx &s2)
{
mtx ret;memset(&ret,,sizeof(ret));
for(int i=;i<len;i++)
for(int j=;j<len;j++)
for(int k=;k<len;k++)
(ret.mp[i][j]+=(s1.mp[i][k]*s2.mp[k][j])%mod)%=mod;
return ret;
}
mtx qpow(mtx &ans,mtx &x,int y)
{
while(y){
if(y&) ans=x*ans;
x=x*x;y>>=;
}
}
}M;
void get_kmp()
{
int i=,j=;
nxt[]=;
while(i<=len)
if(j==||a[i]==a[j])
i++,j++,nxt[i]=j;
else j=nxt[j];
} int main()
{
scanf("%d%d%u",&n,&len,&mod);
scanf("%s",str+);
for(int i=;i<=len;i++) a[i]=str[i]-'';
get_kmp();
mtx pw;memset(&pw,,sizeof(pw));
for(int i=;i<len;i++)
for(int c=;c<=;c++)
{
if(i==len-&&a[len]==c) continue;
int k=i+;
for(k=i+;k>&&a[k]!=c;k=nxt[k]);
pw.mp[k][i]++;
}
mtx ret;memset(&ret,,sizeof(ret));
ret.mp[][]=;
M.qpow(ret,pw,n);
ui ans=;
for(int i=;i<len;i++)
(ans+=ret.mp[i][])%=mod;
printf("%u\n",ans);
return ;
}

---恢复内容结束---

BZOJ 1009 [HNOI2008]GT考试 (KMP+矩阵乘法)的更多相关文章

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

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

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

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

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

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

  4. bzoj 1009 [HNOI2008]GT考试——kmp+矩阵优化dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 首先想到 确保模式串不出现 就是 确保每个位置的后缀不是该模式串. 为了dp,需要记录 ...

  5. BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )

    写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...

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

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

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

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

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

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

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

    题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...

随机推荐

  1. ClipboardJS实现点击复制功能

    <script src="//lib.baomitu.com/clipboard.js/1.7.1/clipboard.min.js"></script> ...

  2. php ob缓存

    用PHP的ob_start();控制您的浏览器cache Output Control 函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况.输出 ...

  3. 03.IO读写-2.用with open进行文件读写

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

  4. Centos7 下安装 Docker

    一.简介 Docker是一个开源的应用容器引擎:是一个轻量级容器技术:Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像:运行中的这个镜 ...

  5. SSM知识巩固2

    数据回显 1.springmvc默认对pojo数据进行回显. pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写) ...

  6. BA-BACnet对象

    BACNET协议有多少个对象呢,拿出西门子教程中的看看一下,居然有48个,其中的大部分都没有用到:

  7. Apach配置本地域名

    分三步: 一,开启虚拟域名设置,在路径中找到(apache\apache2.4.9\conf)httpd.conf 配置文件, 去掉 " Include conf/extra/httpd-v ...

  8. HttpClient异步请求Post传递Json

    HttpClient异步Post请求,HttpClient.PostAsync(String, HttpContent, CancellationToken),String为Post的Url,Http ...

  9. 解决VTune错误PMU resources currently being used by another profiling tool or process

    错误信息: When I ran Hardware Event-based Sampling Analysis 0, it showed the ERROR: Collection failed Co ...

  10. 香蕉派 Banana pi BPI-M2 四核开源单板计算机.

     Banana PI BPI-M2 是一款四核高性能单板计算机,Banana PI BPI-M2是一款比树莓派更强悍的四核Android4.4产品. Banana PI BPI-M2兼容性强大,能 ...