【解题思路】

  先KMP出fail数组,再用fail数组求出M[i][j],表示上一次匹配到第i位,这次可以遇到多少种不同的字符,使之转而匹配到第j位。

  设集合S=[1,m]∩N

  又设f[i][j]表示共读入了i个字符,当前匹配到了第j位时,有多少种情况。有转移方程f[i][j]=Σf[i-1][k]*M[k][j](k∈S),边界f[0][i]=[i=0](i∈S)。

  上述转移方程等价于行向量f[i]=f[i-1]*M,故f[n]=f[0]*Mn,又f[0]=[1,0,...,0],故f[n]=Mn。答案即为∑f[n][i](i∈S)。复杂度O(m2log2n)。

【参考代码】

 #pragma GCC optimize(2)
#include <cstdio>
#include <cstring>
#define REP(i,low,high) for(register int i=(low);i<=(high);++i)
using namespace std; static int n,m,AwD; char jiry[]; int fail[]={}; struct matrix
{
int mat[][]; matrix() {memset(mat,,sizeof mat);}
matrix(const int&thr)
{
memset(mat,,sizeof mat); REP(i,,m-) mat[i][i]=thr;
}
int&operator()(const int&x,const int&y) {return mat[x][y];}
matrix&operator=(const matrix&thr)
{
return memcpy(mat,thr.mat,sizeof thr.mat),*this;
}
matrix&operator=(const int&thr)
{
memset(mat,,sizeof mat); REP(i,,m-) mat[i][i]=thr; return *this;
}
matrix operator*(const matrix&thr)
{
matrix ret; REP(i,,m-) REP(j,,m-) REP(k,,m-)
{
if((ret.mat[i][j]+=mat[i][k]*thr.mat[k][j]%AwD)>=AwD)
{
ret.mat[i][j]-=AwD;
}
}
return ret;
}
matrix&operator*=(const matrix&thr)
{
matrix ret; REP(i,,m-) REP(j,,m-) REP(k,,m-)
{
if((ret.mat[i][j]+=mat[i][k]*thr.mat[k][j]%AwD)>=AwD)
{
ret.mat[i][j]-=AwD;
}
}
return memcpy(mat,ret.mat,sizeof ret.mat),*this;
}
matrix operator^(const int&thr)
{
matrix bas(*this),ret();
for(register int i=thr;i;i>>=,bas*=bas) if(i&) ret*=bas;
return ret;
}
matrix&operator^=(const int&thr)
{
matrix bas(*this),ret();
for(register int i=thr;i;i>>=,bas*=bas) if(i&) ret*=bas;
return memcpy(mat,ret.mat,sizeof ret.mat),*this;
}
}M; int main()
{
scanf("%d%d%d%s",&n,&m,&AwD,jiry+),fail[]=;
REP(i,,m)
{
int idx=fail[i-]; for(;idx&&jiry[idx+]!=jiry[i];idx=fail[idx]);
fail[i]=idx+(jiry[idx+]==jiry[i]);
}
REP(i,,m-) REP(j,'','')
{
int idx=i; for(;idx&&jiry[idx+]!=j;idx=fail[idx]);
idx+=jiry[idx+]==j; if(idx<m&&++M(idx,i)==AwD) M(idx,i)=;
}
M^=n; int ans=; REP(i,,m-) if((ans+=M(i,))>=AwD) ans-=AwD;
return printf("%d\n",ans),;
}

bzoj1009题解的更多相关文章

  1. BZOJ1009:[HNOI2008]GT考试——题解

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

  2. 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)

    [BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...

  3. BZOJ1009 [HNOI2008]GT考试 矩阵

    去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...

  4. 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法

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

  5. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  6. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  9. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

随机推荐

  1. 【JZOJ3920】噪音

    description FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i] ...

  2. spring data jpa 配置文件1

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  3. 【dart学习】-- Dart之元数据

    一,概述 元数据概述  元数据(Metadata),又称中介数据.中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置.历 ...

  4. 栈+括号序列+暴力枚举——cf1248D1

    这个复杂度首先就想到是n3的复杂度,n2枚举换的位置,求值在花费n复杂度 判断一个序列有多少独立的括号子串时用栈处理一下即可 /* 枚举交换两个括号的位置,然后再对新的序列判一次即可 */ #incl ...

  5. 工程师技术(一):启用SELinux保护、自定义用户环境、配置IPv6地址、配置聚合连接、配置firewalld防火墙

    一.启用SELinux保护 目标: 本例要求为虚拟机 server0.desktop0 配置SELinux: 确保 SELinux 处于强制启用模式 在每次重新开机后,此设置必须仍然有效 方案: SE ...

  6. react 教程—核心概念

    react 核心概念  : https://react.docschina.org/docs/getting-started.html(官网) 或  https://www.w3cschool.cn/ ...

  7. CSS中各种百分比(%)

    1.固定定位  position:absolute;width:100%;height:100%: 中%相对的   都是浏览器的可视窗口宽高. 2.标准文档流中,标签的 % 单位除了height以外, ...

  8. error C3861: “L”: 找不到标识符

    提示错误的语句:::CLSIDFromProgID(L("Shell.Application"), &clsid); 解决办法: 出现上面的错误是因为语法错误了,去掉字符串 ...

  9. 用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy

    目录 目录 前文列表 扩展阅读 前言 Models 模型 SQLAlchemy 安装 SQLAlchemy 安装 Mysql 建立 SQLAlchemy 和 Mysql 的连接 前文列表 用 Flas ...

  10. PHP面试 PHP基础知识 二(常量及数据类型)

    常量及数据类型 PHP八种数据类型 四种标量类型 字符串(string).布尔(boolean).浮点(float/double).整型(integer) 两种复合类型 数组(array).对象(ob ...