[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. javascript中继承方式及优缺点(三)

    文以<JavaScript高级程序设计>上的内容为骨架,补充了ES6 Class的相关内容,从我认为更容易理解的角度将继承这件事叙述出来,希望大家能有所收获. 1. 继承分类 先来个整体印 ...

  2. Spring boot之MyBatis

    文章目录1. 环境依赖2. 数据源2.1. 方案一 使用 Spring Boot 默认配置2.2. 方案二 手动创建3. 脚本初始化4. MyBatis整合4.1. 方案一 通过注解的方式4.1.1. ...

  3. input(移动端iOS)输入内容时调用软件盘后页面底部留白问题

    iOS/input输入框调用软键盘底部留白 只需input输入框失去焦点时,让页面自动下移即可恢复 <input placeholder="请输入用户名" v-model=& ...

  4. 笔记本电脑如何同时上内外网(通过usb外接网卡实现虚拟机连外网)

    我们这里达成的方式不是内外网切换,而是真正意义上的同时上内网和外网 原理: 通过构建虚拟机,利用usb外接网卡(某宝某东都有售,价格在50大洋左右)使虚机连接外网,然后开启虚拟机的unity模式 准备 ...

  5. debug1: Could not open authorized keys

    ssh登录的时候一直日志一直出现debug1: Could not open authorized keys登录不上,检查文件夹权限都正常用这条命令解决了 restorecon -FRvv /home ...

  6. BeanDefinition 实例化过程

    BeanDefinition 实例化过程 AbstractBeanFactory#doGetBean AbstractBeanFactory# /** * 根据 bean 名称读取 bean * * ...

  7. Icon 图标

    Icon 图标 提供了一套常用的图标集合. ¶使用方法 直接通过设置类名为 el-icon-iconName 来使用即可.例如: <i class="el-icon-edit" ...

  8. 配置Toad链接远程Oracle数据库

    当前环境: 本机系统:Win7 64位 Toad版本:11 32位 数据库:Oracle 10g =================================== 与PLSQL Develope ...

  9. linux配置多个ip

    linux配置多个ip /sbin/ifconfig eth0:1 172.19.121.180 broadcast 172.19.121.255  netmask 255.255.255.0 up ...

  10. Web03_JavaScript

    案例一:使用JS完成注册页面表单校验 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...