[BZOJ1009][HNOI2008]GT考试 DP+矩阵快速幂+KMP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1009
我们令$dp(i,j)$表示已经填了$i$位,而且后缀与不幸运数字匹配了$j$位,那么转移方程就是$dp(i,j)=dp(i,k)*a(j,k)$,其中$a(j,k)$表示从$j$位可以转移到$k$位的方案数,这个可以利用kmp的ne数组来计数求得。因为DP方程是线性的,所以可以用矩阵优化。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[];
int ne[];
int N,M,K;
struct Matrix{
int lx,ly,a[][];
Matrix(int _lx=,int _ly=){
memset(a,,sizeof(a));
lx=_lx;
ly=_ly;
}
Matrix operator * (const Matrix &_)const{
Matrix t(ly,_.lx);
for(int i=;i<ly;i++)
for(int j=;j<_.lx;j++)
for(int k=;k<lx;k++)
t.a[i][j]=(t.a[i][j]+a[i][k]*_.a[k][j]%K)%K;
return t;
}
}F;
Matrix ksm(Matrix x, int y){
Matrix base=x,sum(M,M);
for(int i=;i<M;i++) sum.a[i][i]=;
while(y){
if(y&) sum=sum*base;
base=base*base;
y>>=;
}
return sum;
}
int main(){
scanf("%d%d%d%s",&N,&M,&K,s+);
ne[]=ne[]=;
for(int i=,j=;i<=M;i++){
while(j&&s[i]!=s[j+]) j=ne[j];
if(s[j+]==s[i]) j++;
ne[i]=j;
}
F.lx=M;
F.ly=M;
for(int i=;i<M;i++){
for(int j='';j<='';j++){
int k=i;
while(k&&s[k+]!=j) k=ne[k];
if(s[k+]==j) k++;
F.a[i][k]++;
}
}
Matrix A(M,M);
A.a[][]=;
A=A*ksm(F,N);
int ans=;
for(int i=;i<M;i++) ans=(ans+A.a[][i])%K;
printf("%d\n",ans);
return ;
}
[BZOJ1009][HNOI2008]GT考试 DP+矩阵快速幂+KMP的更多相关文章
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- [HNOI2008] GT考试(DP+矩阵快速幂+KMP)
题目链接:https://www.luogu.org/problemnew/show/P3193#sub 题目描述 阿申准备报名参加 GT 考试,准考证号为 N 位数 X1,X2…Xn(0 <= ...
- 【bzoj1009】[HNOI2008]GT考试(矩阵快速幂优化dp+kmp)
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1009 这道题一看数据范围:$ n<=10^9 $,显然不是数学题就是矩乘快速幂优 ...
- [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)
[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...
- bnuoj 34985 Elegant String DP+矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂
[题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*
BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...
随机推荐
- 浅谈asp.net通过本机cookie仿百度(google)实现搜索input框自己主动弹出搜索提示
对于通过用户输入关键词实现自己主动弹出相关搜索结果,这里本人给两种解决方式,用于两种不同的情形. 常见方法是在数据库里建一个用户搜索关系表,然后通过用户搜索框输入的keyword异步调用数据表中的相关 ...
- Mysql Solution - Timeout error occurred trying to stop MySQL Daemon. Stopping MySQL: [FAILED] -
错误例如以下: Timeout error occurred trying to stop MySQL Daemon. Stopping mysqld: ...
- C++11,控制台输出的一段小程序。
#include <iostream> // std::cout, std::boolalpha, std::noboolalpha int main () { bool b = true ...
- Android 官方博客 - Android应用程序的内存分析(翻译)(转)
转自:http://www.cnblogs.com/wisekingokok/archive/2011/11/30/2245790.html Dalvik虚拟机支持垃圾收集,但是这不意味着你可以不用关 ...
- 行转列--Excel和数据库的完美结合
入职到如今已经有一段时间了,除了不断完好新功能外,线上运维也是一项非常重要的任务,每天都须要占用一 定量的时间来处理,这时候如何高效准确的来解决这些问题是非常值得考虑的. 今天客服人员给我 ...
- aix用户登录次数受限问题(3004-300 输入了无效的登录名或password)
当登录AIX系统.username或password不对以至于多次登录,超过系统设定的次数,怎样解锁: 1.用root用户登录系统 2.chuser unsuccessful_login_count= ...
- java反射(1)
反射反射,程序员的快乐. 第一次了解反射这个概念是从<<大话设计>>中所了解到的.当时只是对概念的模糊了解,具体对它的机制并不清楚.最近在学习并实践SSH框架,其中Spring ...
- C中使用memset
int i; cout<<memset(&i,1,sizeof(int))<<endl; 输出结果是16843009,而不是填充的1111 1111,为什么呢? 因为m ...
- LDAP方式连接AD获取用户信息
LDAP资料介绍可以参考:http://wenku.baidu.com/view/262742f9f705cc17552709f9.html ldap访问AD域的的错误一般会如下格式: Ldap lo ...
- (21) java web的struts2框架的使用
在javaweb开发过程中,如果只使用servlet,jdbc,jsp进行开发,也可以遵从MVC的模式,这时候,servlet相当于control层,属于负责处理业务逻辑的控制器,同时也需要对获取和返 ...