题意:存在一个长度为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. 模拟在table中移动鼠标,高亮显示鼠标所在行,固定表头

    <!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Conten ...

  2. Smart Pointe

    http://blog.chinaunix.net/uid-625789-id-2720884.html

  3. Page Object页面设计模式核心要点

      Page Object,页面对象.一种设计模式,实施selenium的最佳实践,体现了web应用与页面显示之间的关系.为什么需要Page Object?测试代码维护的需要:减少代码的编码量,减少代 ...

  4. Linux 基础教程 33-硬盘分区及挂载

    挂载命令     在Windows系统中如果插入了U盘.移动硬盘.光驱等,只要能被Windows系统识别出来,则系统会进行自动挂载并添加盘符,然后我们就可以访问,而这一切均由系统完成,用户并不需要做任 ...

  5. jmeter 各种配置修修改(后续增加)

    1.修改物理内存  使用jmeter进行压力测试时遇到一段时间后报内存溢出outfmenmory错误,导致jmeter卡死了,先尝试在jmeter.bat中增加了JVM_ARGS="-Xmx ...

  6. java并发编程工具类辅助类:CountDownLatch、CyclicBarrier和 Semaphore

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法. 以下 ...

  7. 测试嵌入GeoGebra网页

    使用 http://ggbstudy.top/tools/ggb2html/ 将GGB文件免费托管,然后在博客内容中点击“HTML”按钮插入GGB网页地址: <iframe src=" ...

  8. 团队博客第三周(Running Duck队)

    代码链接:Tetris 码云链接 一.需求&原型改进 1.原型改进 汉字方块每次可生成一个并逐渐下落 可通过触摸左右下滑动实现方块的左右移动和快速下滑 左上角按钮可对汉字进行暂时保存和替换 右 ...

  9. 浏览器缓存和Service Worker

    浏览器缓存和Service Worker @billshooting 2018-05-06 字数 6175 Follow me on Github 标签: BOM 1. 传统的HTTP浏览器缓存策略 ...

  10. C#注册表操作类(完整版) 整理完整

    /// <summary> /// 注册表基项静态域 /// /// 主要包括: /// 1.Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 /// ...