原来的DP:

dp[i][j]表示长度为i的合法串,并且它的长度为j的后缀是给定串的长度为j的前缀。

转移:

i==0

dp[0][0] = 1 dp[0][1~m-1] = 0

i>=1

dp[i][0] = dp[i-1][0]*10-dp[i-1][m-1]

dp[i][1] = dp[i-1][0]-(a[m]==a[1])*dp[i-1][m-1]

dp[i][2] = dp[i-1][1]-(a[m-1~m]==a[1~2])*dp[i-1][m-1]

dp[i][3] = dp[i-1][2]-(a[m-2~m]==a[1~3])*dp[i-1][m-1]

...

dp[i][m-1] = dp[i-1][m-2]-(a[2~m]==a[1~m-1])*dp[i-1][m-1]

(a[i~j]==a[p~q]表示原串的[i,j]区间与[p,q]区间是否相等)

然后就是一般的矩阵求线性递推的东西了。

 /**************************************************************
Problem: 1009
User: idy002
Language: C++
Result: Accepted
Time:48 ms
Memory:804 kb
****************************************************************/ #include <cstdio> int n, m, mod;
int a[];
bool mat[]; struct Matrix {
int a[][];
void make_zero() {
for( int i=; i<m; i++ )
for( int j=; j<m; j++ )
a[i][j] = ;
}
void make_unit() {
for( int i=; i<m; i++ ) {
for( int j=; j<m; j++ )
a[i][j] = ;
a[i][i] = ;
}
}
Matrix operator*( const Matrix & B ) const {
const Matrix & A = *this;
Matrix C;
C.make_zero();
for( int i=; i<m; i++ )
for( int j=; j<m; j++ )
for( int k=; k<m; k++ ) {
C.a[i][j] += A.a[i][k]*B.a[k][j];
C.a[i][j]%=mod;
}
return C;
}
}; void prep() {
for( int i=; i<m-; i++ ) {
mat[i] = true;
for( int j=; j<=i; j++ )
if( a[j]!=a[m-i-+j] ) {
mat[i] = false;
break;
}
}
}
Matrix mpow( Matrix a, int b ) {
Matrix rt;
rt.make_unit();
for( ; b; b>>=,a=a*a )
if( b& ) rt=rt*a;
return rt;
} void work() {
Matrix a;
a.make_zero();
a.a[][] = ;
a.a[][m-] = -;
for( int i=; i<m; i++ ) {
a.a[i][i-] = ;
a.a[i][m-] = -mat[i-];
}
a = mpow(a,n);
int ans = (a.a[][]%mod+mod)%mod;
printf( "%d\n", ans );
} int main() {
scanf( "%d%d%d", &n, &m, &mod );
char ch;
while( scanf( "%[\n ]", &ch ) );
for( int i=; i<m; i++ ) {
scanf( "%c", &ch );
a[i] = ch-'';
}
prep();
work();
}

bzoj 1009 DP 矩阵优化的更多相关文章

  1. bzoj 1009 DP+矩阵加速

    我们用DP来解决这个问题 W[I,J]表示准考证的第I位,和不吉利的数匹配到了第J位的方案数,这个状态的表示也可以看成 当前到第I位了,准考证的后J位是不吉利的数的前J位,的方案数 那么我们最后的an ...

  2. hdu 4576(简单概率dp | 矩阵优化)

    艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle?  感觉很不公平.大家算法都一致,因为我程序没有那 ...

  3. CF1151F Sonya and Informatics (计数dp+矩阵优化)

    题目地址 Solution (duyi是我们的红太阳) (这里说一句:这题看上去是一个概率dp,鉴于这题的概率dp写法看上去不好写,我们其实可以写一个计数dp) 首先拿到这个题目我们要能设出一个普通d ...

  4. Codeforces 917C - Pollywog(状压 dp+矩阵优化)

    UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...

  5. New Year and Old Subsequence CodeForces - 750E (dp矩阵优化)

    大意: 给定字符串, 每次询问区间[l,r]有子序列2017, 无子序列2016所需要删除的最小字符数 转移用矩阵优化一下, 要注意$(\mathbb{Z},min,+)$的幺元主对角线全0, 其余全 ...

  6. BZOJ4000 [TJOI2015]棋盘 【状压dp + 矩阵优化】

    题目链接 BZOJ4000 题解 注意题目中的编号均从\(0\)开始= = \(m\)特别小,考虑状压 设\(f[i][s]\)为第\(i\)行为\(s\)的方案数 每个棋子能攻击的只有本行,上一行, ...

  7. [Vijos1067]Warcraft III 守望者的烦恼(DP + 矩阵优化)

    传送门 可知 f[i] = f[i - 1] + f[i - 2] + ... + f[i - k] 直接矩阵优化就好了 #include <cstdio> #include <cs ...

  8. BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 思路:真的是好题啊! 对于这种题目,很有可能就是dp,$f[i][j]$表示分析到第 ...

  9. BZOJ 1875(DP+矩阵快速幂)

    题面 传送门 分析 容易想到根据点来dp,设dp[i][j]表示到i点路径长度为j的方案数 状态转移方程为dp[i][k]=∑(i,j)∈Edp[j][k−1]" role="pr ...

随机推荐

  1. 微信小程序迁移到头条小程序工具

    最近公司需要将微信小程序迁移到头条小程序,比较得知微信和头条小程序的写法类似,只有文件名称不同,相关的指令不同,以及头条在ttml绑定的数据不可使用function,于是就写了node脚本来实现这些重 ...

  2. JFinal向客户端渲染图片的方法

    JFinal提供了好几种方便的render但是不知道为啥就是没有提供直接渲染图片的render,如果我们直接在Controller的方法中往输入流中写的话是还是会有默认的render生效的,比如下面这 ...

  3. 24、简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...

  4. VC连接access

    (1)首先拷贝 c:\program files\common files\system\ado\ 目录中的 msado15.dll 文件到项目中. (2)在VC中加入DLL,具体方法如下: (3)创 ...

  5. c语言学习笔记.条件编译.#if,#ifdef,if的区别

    最近遇到了,以此做个记录. 条件编译 是C预处理部分的内容. 其判断语句包括 #if  #else if  #else 以及 #ifdef 和 #endif. 使用 #if (表达式) codes1. ...

  6. 删除none的images

    脚本 #!/bin/bash docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop docker p ...

  7. kernel随机生成MAC地址的接口

    /**  * eth_random_addr - Generate software assigned random Ethernet address * @addr: Pointer to a si ...

  8. vue数据传递--我有特殊的实现技巧

    最近碰到了比较多的关于vue的eventBus的问题,之前定技术选型的时候也被问到了,vuex和eventBus的使用范围.所以简单的写一下.同时有一种特殊的实现方案. 有这么几种数据传递方式,vue ...

  9. chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  10. Effective C++笔记(五):实现

    参考:http://www.cnblogs.com/ronny/p/3754755.html 条款26:尽可能延后变量定义式的出现时间 有些对象,你可能过早的定义它,而在代码执行的过程中发生了导常,造 ...