bzoj1009题解
【解题思路】
先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题解的更多相关文章
- BZOJ1009:[HNOI2008]GT考试——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1009 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0&l ...
- 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)
[BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...
- BZOJ1009 [HNOI2008]GT考试 矩阵
去博客园看该题解 题目 [bzoj1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn(0<=Xi<=9),他不希望准 ...
- 【BZOJ1009】[HNOI2008]GT考试 next数组+矩阵乘法
[BZOJ1009][HNOI2008]GT考试 Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的 ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
随机推荐
- 08-03-re-模块
一组特殊符号组成的表达式,用于描述某种规则.该应用场景生活中随处可见. 例如:让有志青年过上体面的生活,这里面就由规则,即有志青年. 正则表达式的作用,以及使用场景 1.用于从字符串中匹配满足 ...
- 影响Acorn for Mac图像打印质量的因素有什么?怎样处理这些因素才能得到打印效果最佳的图像?
Acorn for Mac是Mac OS平台上一款比较不错的图像处理软件.acorn mac版用起来都很像神器 Photoshop,是的,它的设计目标就是成为 Photoshop 的轻量替代者,拥有所 ...
- Java之数据库连接池
未使用数据库连接池,需要从底层申请数据库连接来访问数据库,访问结束之后需要把链接丢弃.长此以往浪费时间. 数据库连接池就是用容器来申请访问,容器里有很多连接对象,用户来容器里拿一个连接对象一起访问数据 ...
- Vue学习笔记【12】——过滤器
概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的尾部,由 ...
- HTML5新表单新功能解析
HTML5新增了很多属性功能.但是有兼容性问题,因为这些表单功能新增的.我这里做了一个简单的练习,方便参考.如果完全兼容的话,那我们写表单的时候就省了很多代码以及各种判断. <!DOCTYPE ...
- HTML之web项目的目录结构
文件夹树注解 htmls html一个文件放除去index.html外的其他页面文件. imgs 存放所有的图片文件:.png..jpg..jpeg.壁纸等. 示例:icon.png.ho ...
- Android 读取<meta-data>元素的数据
在AndroidManifest.xml中,<meta-data>元素可以作为子元素,被包含在<activity>.<application> .<servi ...
- (转)ubuntu下如何安装使用SSH?
转:http://os.51cto.com/art/201109/291634.htm ubuntu默认并没有安装ssh服务,如果通过ssh链接ubuntu(比如使用securecrt客户端来访问ub ...
- linux下vim编辑器查找 关键字
在 linux vim 编辑器 下查找 关键字 方法[一] 1?short_open_tag : 它的意思是vim 打开文件的第一行 ? : 它的意思是反向查找 short_open_tag ...
- Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click
Pycharm设置 Pycharm总是很多的拼写检查波拉线 Spellchecker inspection helps locate typos and misspelling in your cod ...