题意:存在一个长度为m的串str,求长度为n的不含str子串的字符串的方案数

什么鬼题目

设\(f[i][j]\):长为\(i\)的串中以\(i\)结尾的长度为\(j\)的后缀 与 模式串(str)中长度为\(j\)的前缀 匹配的方案数(文本串不包含完整的str为前提)

其中\(f[0][0]=1\)

那么答案是\(\sum_{i=0}^{m-1}f[n][i]\)

设\(cnt[i][j]\):\(f[k][i]\)转移到\(f[k+1][j]\)的方案数

转移方程就有\(f[i][j]=\sum_{k=0}^{m-1}f[i-1][k]*cnt[k][j]\)

\(cnt\)可由kmp得到(暴力也ok),\(f\)只需由cnt作为矩阵求出\(cnt^n\)即可

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define println(a) printf("%lld\n",(ll)a)
using namespace std;
const int MAXN = 233 + 11;
const int INF = 0x3f3f3f3f;
typedef long long ll;
ll read(){
ll x=0, f=1; register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,MOD;
int nxt[MAXN];
char str[MAXN];
int cnt[MAXN][MAXN];
void init(){
nxt[1]=0;
for(int i=2,j=0;i<=m;i++){
while(j&&str[i]!=str[j+1]) j=nxt[j];
if(str[i]==str[j+1]) j++;
nxt[i]=j;
}
memset(cnt,0,sizeof cnt);
for(int i=0;i<m;i++){//f[i]->f[i+1]
for(int k='0';k<='9';k++){
int j=i;
while(j&&str[j+1]!=k) j=nxt[j];
if(str[j+1]==k) cnt[i][j+1]++;//
else cnt[i][0]++;
}
}
}
struct Matrix{
int mt[33][33];
Matrix(){memset(mt,0,sizeof m);}
Matrix(int k){
memset(mt,0,sizeof mt);
if(k==1) rep(i,0,m-1) mt[i][i]=1;
}
int* operator[](int k){return mt[k];}
Matrix operator*(Matrix rhs){
Matrix ans;
memset(ans.mt,0,sizeof ans.mt);
rep(i,0,m-1){
rep(j,0,m-1){
rep(k,0,m-1){
ans[i][j]=ans.mt[i][j]+(mt[i][k]*rhs[k][j])%MOD;
if(ans[i][j]>=MOD) ans[i][j]%=MOD;
}
}
}
return ans;
}
};
Matrix fpw(Matrix a,int n){
Matrix res(1);
while(n){
if(n&1) res=res*a;
a=a*a; n>>=1;
}
return res;
}
int main(){
while(cin>>n>>m>>MOD){
scanf("%s",str+1);
init();
Matrix b;
rep(i,0,m-1) rep(j,0,m-1) b[i][j]=cnt[i][j];
Matrix res=fpw(b,n);
ll ans=0;
rep(i,0,m-1) ans=(ans+res[0][i])%MOD;
println(ans);
}
return 0;
}

BZOJ - 1009 KMP+可达矩阵的更多相关文章

  1. BZOJ 1009 [HNOI2008]GT考试 ——矩阵乘法 KMP

    先用KMP处理所有的转移,或者直接暴力也可以. 然后矩阵快速幂即可. #include <cstdio> #include <cstring> #include <ios ...

  2. BZOJ 1009 [HNOI2008]GT考试(矩阵快速幂优化DP+KMP)

    题意: 求长度为n的不含长为m的指定子串的字符串的个数 1s, n<=1e9, m<=50 思路: 长见识了.. 设那个指定子串为s f[i][j]表示长度为i的字符串(其中后j个字符与s ...

  3. [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】

    题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...

  4. 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)

    [BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...

  5. hdu 2157 How many ways?? (可达矩阵)

    题意:给你一个有向图,从A 点到 B点恰好经过k个点的方案数 (k < 20), 可以走重复边 思路:利用离散数学中的可达矩阵,可达矩阵的K次幂便是从i到j走K步能到达的方案数 代码: #inc ...

  6. POJ 3660 Cow Contest(Floyd求传递闭包(可达矩阵))

    Cow Contest Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16341   Accepted: 9146 Desc ...

  7. 计蒜客 疑似病毒 (AC自动机 + 可达矩阵)

    链接 : Here! 背景 : 开始我同学是用 AC自动机 + DP 的方法来做这道题, 这道题的标签是 AC自动机, 动态规划, 矩阵, 按道理来说 AC自动机 + DP 应该是能过的, 但是他不幸 ...

  8. bzoj 1009 [HNOI2008]GT考试(DP+KMP+矩阵乘法)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1009 [题意] 给定一个字符串T,问长度为n且不包含串T的字符串有多少种. [思路] ...

  9. BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )

    写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...

随机推荐

  1. [Selenium] 怎样判断是否适合自动化测试

    实施自动化测试前需要对软件开发过程进行分析,以观察其是否适合使用自动化测试.通常需要满足以下条件: 1)需求变动不频繁 2)项目周期足够长 3)自动化测试脚本可重复使用 4)手工测试无法完成或者需要大 ...

  2. 在sublime text中添加JavaScript的build-system

    -step 1: 下载安装node.js, 并添加到path变量中. -step 2: 在sublime text中新建一个build-system. tools --> build-syste ...

  3. 14 Finding a Shared Motif

    Problem A common substring of a collection of strings is a substring of every member of the collecti ...

  4. msfvenom木马生成+免杀+壳(实测并不能免杀)

    msfvenom 选项: -p, --payload 有效载荷使用.指定一个有效的自定义载荷 --payload-options 列出有效载荷的标准选项 -l, --list [type] 列出一个模 ...

  5. 个人作业代码GitHub提交步骤

    代码提交地址: https://github.com/eudaem/homework1 步骤: 1)用个人账号登陆GitHub,并访问代码提交地址页面,点击页面右上角的“Fork”按钮,拷贝homew ...

  6. [label][转载][paypal]paypal在线支付接口的WEB语言设置

    http://stephen830.iteye.com/blog/274072 ★★★ 本篇为原创,需要引用转载的朋友请注明:< http://stephen830.iteye.com/blog ...

  7. EBS请求查找运行详细信息

    --查找运行请求时间,参数等(可以是某用户的,某个报表) select c.user_name,       papf.full_name,       b.user_concurrent_progr ...

  8. 简单配置vps,防ddos攻击

    防人之心不可无. 网上总有些无聊或者有意的人.不多说了.上干货,配置vps apf防小流量ddos攻击. 对于大流量的ddos攻击, 需要机房的硬件防火墙,vps内部可能也扛不住. 1. 安装 DDo ...

  9. 不写代码也能爬虫Web Scraper

    https://www.jianshu.com/p/d0a730464e0c web scraper中文网 http://www.iwebscraper.com/category/%E6%95%99% ...

  10. 控制 MediaElement(播放、暂停、停止、音量和速度)

    控制 MediaElement(播放.暂停.停止.音量和速度) WPF中对于多媒体的支持非常完整,一般都是通过MediaElement来实现的. http://msdn.microsoft.com/z ...