[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

题面

阿申准备报名参加GT考试,准考证号为N位数X1X2….Xn,他不希望准考证号上出现不吉利的数字。他的不吉利数学A1A2…Am有M位,不出现是指X1X2…Xn中没有恰好一段等于A1A2…Am. A1和X1可以为0

\(0 \leq X_i \leq 9,0\leq Ai\leq 9,m \leq 20,n \leq 10^9\)

分析

先考虑暴力的思路,设\(dp[i][j]\)表示前i位数与不吉利数字匹配了前j位的方案数

那么\(dp[i][f(j,c)]=\sum dp[i-1][j] (c \in[0,9])\)

实际上就是从0~9枚举第i位的数字,然后更新匹配的位数。其中\(f(j,c)\)表示加入数字c后的匹配位数。

但是\(n \leq 10^9\),直接dp显然会超时,发现每层转移都是一样的,所以可以矩阵快速幂优化

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000
#define maxm 20
using namespace std;
typedef long long ll;
char t[maxm+5];
int nex[maxm+5];
void get_nex(char *a){
int len=strlen(a+1);
for(int i=2,j=0;i<=len;i++){
while(j>0&&a[j+1]!=a[i]) j=nex[j];
if(a[j+1]==a[i]) j++;
nex[i]=j;
}
} int n,m,mod;
int match(int j,char c){
while(j>0&&t[j+1]!=c) j=nex[j];
if(t[j+1]==c) j++;
return j;
} struct matrix{
ll x[maxn+5][maxn+5];
void set(int p){
if(p==0){
for(int i=0;i<m;i++) for(int j=0;j<m;j++) x[i][j]=0;
}else{
for(int i=0;i<m;i++) for(int j=0;j<m;j++) x[i][j]=0;
for(int i=0;i<m;i++) x[i][i]=1;
}
}
void print(){
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
printf("%lld ",x[i][j]);
}
printf("\n");
}
}
friend matrix operator * (matrix a,matrix b){
matrix ans;
ans.set(0);
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
for(int k=0;k<m;k++){
ans.x[i][j]+=a.x[i][k]*b.x[k][j]%mod;
ans.x[i][j]%=mod;
}
}
}
return ans;
}
};
matrix fast_pow(matrix x,int k){
matrix ans;
ans.set(1);
while(k){
if(k&1) ans=ans*x;
x=x*x;
k>>=1;
}
return ans;
} int main(){
scanf("%d %d %d",&n,&m,&mod);
scanf("%s",t+1);
get_nex(t);
// dp[0][0]=1;
// for(int i=1;i<=n;i++){
// for(int j=0;j<m;j++){
// for(char ch='0';ch<='9';ch++){
// int k=match(j,ch);
// dp[i][k]+=dp[i-1][j];
// dp[i][k]%=mod;
// }
// }
// }
matrix tp,ans;
tp.set(0);
for(int j=0;j<m;j++){
for(char ch='0';ch<='9';ch++){
int k=match(j,ch);
tp.x[j][k]++;
}
}
// tp.print();
ans=fast_pow(tp,n);
// ans.print();
ll res=0;
for(int j=0;j<m;j++){
res+=ans.x[0][j];
res%=mod;
}
printf("%lld\n",res);
}

[BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)的更多相关文章

  1. BZOJ.1009.[HNOI2008]GT考试(KMP DP 矩阵快速幂)

    题目链接 设f[i][j]为当前是第i位考号.现在匹配到第j位(已有j-1位和A[]匹配)的方案数 因为假如当前匹配j位,如果选择的下一位与A[j+1]不同,那么新的匹配位数是fail[j]而不是0, ...

  2. bzoj1009: [HNOI2008]GT考试 ac自动机+矩阵快速幂

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

  3. [BZOJ1009] [HNOI2008] GT考试 (KMP & dp & 矩阵乘法)

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

  4. $bzoj1009-HNOI2008$ $GT$考试 字符串$dp$ 矩阵快速幂

    题面描述 阿申准备报名参加\(GT\)考试,准考证号为\(N\)位数\(x_1,x_2,...,x_n\ (0\leq x_i\leq 9)\),他不希望准考证号上出现不吉利的数字. 他的不吉利数字\ ...

  5. 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2745  Solved: 1694[Submit][Statu ...

  6. bzoj 1009: [HNOI2008]GT考试【kmp+dp+矩阵快速幂】

    看n和k的范围长得就很像矩阵乘法了 设f[i][j]表示到第i个位置的后缀最长匹配目标串的j位.转移的话显然是枚举0~9,然后选择f[i+1]中能被他转移的加起来,需要用到next数组.然后构造矩阵的 ...

  7. [BZOJ1009][HNOI2008]GT考试(KMP+DP)

    [不稳定的传送门 Solution dp[i][j]表示前i个字符当前匹配到不吉利串的第j个,即当前方案的后缀等于不吉利串前缀 然而由于n过大,不能直接转移,用矩阵优化 Code #include & ...

  8. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)

    Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...

  9. 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 ...

随机推荐

  1. 上传文件夹 vue

    ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...

  2. BZOJ 5084: hashit 后缀自动机(原理题)

    比较考验对后缀自动机构建过程的理解. 之前看题解写的都是树链的并,但是想了想好像可以直接撤销,复杂度是线性的. 自己想出来的,感觉后缀自动机的题应该不太能难倒我~ 注意:一定要手画一下后缀自动机的构建 ...

  3. 学习笔记:python3,代码。小例子习作

    http://www.cnblogs.com/qq21270/p/7634025.html 学习笔记:python3,一些基本语句(一些基础语法的代码,被挪到这里了) 日期和时间操作 http://b ...

  4. Nginx配置记录【例3】

    C服务器,例: [root@82_www_db_2 conf.d]# egrep -v "^#|^$" /etc/nginx/nginx.conf user nginx; work ...

  5. 如何将JS中object转换为字符串

    var obj = JSON.parse(str); //由JSON字符串转换为JSON对象 var last=obj.toJSONString(); //将JSON对象转化为JSON字符 或者 va ...

  6. 【Share Code | Javascript & HTML & CSS】链接悬停显示图像效果

    demo & 代码 链接悬停效果,显示缩略图. 今天给大家分享一组链接悬停效果.悬停链接时显示具有特定效果的缩略图. 这是一些效果: 参考 Image Reveal Hover Effects

  7. C++入门经典-例4.11-名称空间的定义和使用

    1:名称空间,也成为名字空间.命名空间,关键字为namespace.我们经常使用这样一条语句: using namespace std: 我们要使用标准输入输出流,除了包含它们所在的头文件外,还必须使 ...

  8. dubbo源码阅读笔记-如何引用远程服务,变成invoker

    1 消费端如何通过注册中心获取远程服务的invoker? RegistryDirectory.subscribe从注册中心中获取provider的url,通过DubboProtocol的refer方法 ...

  9. 选题 Scrum立会报告+燃尽图 05

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8749 一.小组情况组长:贺敬文组员:彭思雨 王志文 位军营 杨萍队名:胜 ...

  10. WikiData Processing

    WikiData Processing Data Accessing To download latest-all.json.bz2 on the page https://dumps.wikimed ...