[关键字]:动态规划 矩阵乘法

[题目大意]:给定一个字符集为(0-9)的字符串T(length<=20),求长度为N的不包含T的字符串的总数。

//==========================================================================

[分析]:首先可以用KMP求next数组的方法求出f[i][j],T串的前i个字符组成的一个串+任意一个字符的后j位和T的前j各字符匹配的方案数。把这个数组乘n遍后f[0][i]就是T的前0

个加上n个字符后i为和T前i位匹配的方案数。ans=Σf[0][i](0<=i<=m-1)。而f数组的n次方可以用快速幂加矩阵乘法快速解决。

[代码]:

View Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;const int MAXN=30;int n,m,MOD;
int a[MAXN],p[MAXN];
int temp[MAXN][MAXN],temp2[MAXN][MAXN];
int b[MAXN][MAXN],f[MAXN][MAXN];void Init()
{scanf("%d%d%d\n",&n,&m,&MOD);for (int i=1;i<=m;++i) scanf("%c",&a[i]),a[i]-='0';//for (int i=1;i<=m;++i) printf("%d ",a[i]);
}void KMP()
{int k=0;p[1]=0;for (int i=2;i<=m;++i){while (k>0 && a[i]!=a[k+1]) k=p[k];if (a[i]==a[k+1]) ++k;;p[i]=k;}
}void Work()
{memset(b,0,sizeof(b));for (int i=0;i<m;++i)for (int j=0;j<=9;++j){int k=i;while (k>0 && a[k+1]!=j) k=p[k];if (a[k+1]==j) ++b[i][k+1]; else ++b[i][0];}memcpy(f,b,sizeof(b));
}void Power(int n)
{if (n==1) return;Power(n/2);memset(temp,0,sizeof(temp));for (int i=0;i<m;++i)for (int j=0;j<m;++j)for (int k=0;k<m;++k)temp[i][j]=(temp[i][j]+f[i][k]*f[k][j])%MOD;memcpy(f,temp,sizeof(f));                 if (n%2==1){memset(temp2,0,sizeof(temp2));for (int i=0;i<m;++i)for (int j=0;j<m;++j)for (int k=0;k<m;++k)temp2[i][j]=(temp2[i][j]+temp[i][k]*b[k][j])%MOD;memcpy(f,temp2,sizeof(f));}
}void Solve()
{KMP();//for (int i=1;i<=m;++i) printf("%d ",p[i]);//printf("\n");
     Work();/*for (int i=0;i<m;++i){for (int j=0;j<m;++j) printf("%d ",f[i][j]);printf("\n");}*/Power(n);/*for (int i=0;i<m;++i){for (int j=0;j<m;++j) printf("%d ",f[i][j]);printf("\n");}*/int sum=0;for (int i=0;i<m;++i) sum=(sum+f[0][i])%MOD;printf("%d\n",sum);
}int main()
{freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);Init();//for (int i=1;i<=m;++i) printf("%d ",a[i]);//printf("\n");
    Solve();return 0;
}

转载于:https://www.cnblogs.com/procedure2012/archive/2012/04/07/2435533.html

[HNOI2008 GT考试]相关推荐

  1. BZOJ 1009 [HNOI2008]GT考试

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2154  Solved: 1327 [Submit][Sta ...

  2. BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...

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

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 3932  Solved: 2398 [Submit][Sta ...

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

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

  5. [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]

    解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...

  6. BZOJ 1009:[HNOI2008]GT考试

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1009 大意:给一个长度不大于20的数字串,求长度为N(10^9)的所有数字串中不包含该串 ...

  7. BZOJ 1009: [HNOI2008]GT考试(kmp+dp+矩阵优化)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 思路: 真的是好题啊! 对于这种题目,很有可能就是dp,$f[i][j]$表示分析到第 ...

  8. [HNOI2008]GT考试

    题意 有一个长度为\(n\)\((n\le1e^9)\)只由阿拉伯数字组成的串\(A\),现在给一个长度为\(m\)\((m\le20)\)同样只由阿拉伯数字组成的串\(B\),求满足条件的\(A\) ...

  9. BZOJ[1009] [HNOI2008]GT考试

    了了已久的心结 f[i][j]表示到第i为,长度为j的后缀与不吉利数字的前缀相同,其实这个和一些期望概率的DP类似,利用a数组记录当前j在加上不同的数字之后,可以分别转移至那些状态,用KMP处理一下, ...

最新文章

  1. Java基础学习总结(10)——static关键字
  2. Transient关键字的使用
  3. mysql数据库事件不执行_如何查看mysql事件是否执行
  4. html中的高和宽背景色怎么写,css background-size与背景图片填满div
  5. GAN生成对抗网络-GAN原理与基本实现-去噪与卷积自编码器01
  6. Mint-ui框架Index List 的应用,以及高度的适配问题
  7. js负数比较大小_【建阳童小|阅享数学(第十一期)】负数的由来
  8. oracle 查看白名单,oracle配置访问白名单教程
  9. python数据分析实例_Python数据分析及可视化实例之爬虫源码(05)
  10. 黑苹果EFI|联想 Lenovo ideapad 320S-15IKB 笔记本电脑实战黑苹果
  11. win10下使用mklink命令给C盘软件搬家
  12. [转载]郭云深先生解说形意拳经--九要论
  13. SWUST OJ954: 单链表的链接
  14. OpenCV总结6——stitcher
  15. 量化交易alpha、beta、shape等基本概念梳理
  16. mysql preparing状态_【Docker】在集群中部署应用为什么始终是Preparing状态
  17. 无机光致变色化合物-过渡金属氧化物WO3/MoO3/TiO2
  18. 丢手帕程序C语言,约瑟夫问题,即丢手帕游戏
  19. c语言设计篮球计分器软件,会玩篮球更会玩篮球赛计时计分器,完整设计资料开源...
  20. php json数据条数,PHP中的JSON数据

热门文章

  1. python统计excel中重复数据_EXCEL公式解读:统计不重复个数
  2. 谷歌浏览器安卓版_谷歌翻译(在线翻译)下载-谷歌翻译下载安装安卓版v5.12.0...
  3. C++知识点31——使用C++标准库(关联容器multimap及其初始化,赋值,查找,添加,删除与迭代器失效)
  4. 3.innodb内存结构
  5. 无法打开文件“python310_d.lib”
  6. HALCON双目三维重建实验
  7. 变量值为NAN的什么意思
  8. CloseHandle()函数的使用(转载)
  9. MySQL 优化实战记录
  10. 巧用Eclipse Java编辑器调试