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 只做出来四道比较水的题目,还需要加强中等题的训练 ...
随机推荐
- nodejs 进阶:图片缩小
demo 效果: 代码: /** * Created by ZXW on 2017/10/30. */ var fs = require('fs'); var gm = require('gm'); ...
- Windows添加右键新增.md文件
因为习惯用Markdown来写文档, 所以常常需要新建.md文档,但由于Windows并不会自带把.md文档放入右键新建项中(像Word那样),所以方便起见,自己手动设置,其实就是把它写进Window ...
- 搭建基于Linux6.3+Nginx1.2+PHP5+MySQL5.5的Web服务器全过程
http://blog.chinaunix.net/uid-20639775-id-154497.html
- bzoj4403题解
[参考代码] #pragma GCC optimize(2) #include <cstdlib> #define function(type) __attribute__((optimi ...
- 向量vector 容器浅析
一.什么是vector? 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container).跟任意其它类型容器一样,它能够存放各种类型的对象.可以简单的认为,向量是一个能 ...
- robotframework + selenium2library 一点测试的经验
1 对于元素的外层包括frame/iframe标签的.一定要先select frame name=xxx,然后再操作元素. Select frame name=新建个案 click element ...
- python 调用redis
#!/usr/bin/env python #_*_ coding:UTF-8 _*_ import redis import pickle #普通连接 ''' db="db1" ...
- RabbitMQ使用(一)
1. 安装与使用 1. 激活 RabbitMQ's Management Plugin (前面跟绝对路径) "D:\娱乐\rabbitmq_server-3.6.5\sbin\rabbitm ...
- 拾遗:YouCompleteMe 前传——编译安装 llvm + clang
http://llvm.org/docs/GettingStarted.html 一.下载安装 cmake >=3.4.3 yum install gcc gcc-c++curl -O http ...
- Ubuntu12.04下安装sourcenavigator-NG4.5阅读源代码
大家知道Windows下有一个很好的查看源代码的软件sourceinsight,使用sourceinsight查看Linux内核代码.嵌入式软件开发中的C语言项目源代码.驱动程序代码很是方便.在Lin ...