题目链接:
http://www.lydsy.com/JudgeOnline/problem.php?id=1009

大意:给一个长度不大于20的数字串,求长度为N(10^9)的所有数字串中不包含该串的串的个数,结果对K取模。

这道题。。作为一个蒟蒻,感觉网上很多题解说的是KMP+矩乘,不是很容易理解。自己认为把问题转化成AC自动机(trie图)上的路径条数,可能好想一些(其实原理是一样的w)。
首先,对模板串建立一个AC自动机,然后对每个点将当遇到数字0-9各应该转移到哪个点处理出来(不向最后一个点连边,因为最后一个点表示匹配到了模板串),得到一张图。于是在该图上的1号点(ac自动机的起点)到所有点的长度为N的路径条数之和就是答案。
用矩阵快速幂搞一搞就好了,O(M^3logN)。实际操作中为了方便处理,加一个0号点作为终点,每个点向它连边,算的时候算长度为(N+1)的路径。

顺便推荐一个ac自动机的动画演示的网站:http://blog.ivank.net/aho-corasick-algorithm-in-as3.html

贴一下代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int N, M, K;
struct Mat
{int m[25][25];Mat(int x = 0){memset(m, 0, sizeof(m));if(x) for(int i = 0; i < M; ++i) m[i][i] = x;}int *operator[](int k){return m[k];}
};
Mat operator*(Mat a, Mat b)
{Mat c;for(int i = 0; i < M; ++i){for(int k = 0; k < M; ++k){for(int j = 0; j < M; ++j){c[i][j] = (c[i][j]+(ll)a[i][k]*b[k][j]%K)%K;}}}return c;
}
Mat operator^(Mat a, int b)
{Mat r(1);while(b){if(b&1) r = r*a;a = a*a; b >>= 1;}return r;
}
//前面都是矩阵部分
char s[25];
int fail[25], go[25][10];
int main()
{
//  freopen("in.txt", "r", stdin);scanf("%d%d%d", &N, &M, &K);scanf("%s", s);for(int i = 0; i < 10; ++i) go[0][i] = 1;//建ac自动机(其实就是kmp求next数组)for(int i = 0, j = 0; i < M; ++i){while(j && s[j-1]!=s[i]) j = fail[j];fail[i+2] = ++j;}
//  for(int i = 0; i < M+2; ++i) printf("fail[%d]=%d\n", i, fail[i]);for(int i = 0; i < M; ++i){for(int j = 0; j < 10; ++j){if(j == s[i]-'0') go[i+1][j] = i+2;else{int t = fail[i+1];while(t && s[t-1]-'0'!=j) t = fail[t];go[i+1][j] = t+1;}}}Mat a; //建图for(int i = 1; i < M+1; ++i){for(int j = 0; j < 10; ++j){int v = go[i][j];if(v!=M+1) a[i][v]++;}a[i][0] = 1;}M++;a = a^(N+1); //核心代码printf("%d\n", a[1][0]);return 0;
}

转载于:https://www.cnblogs.com/will7101/p/6506684.html

BZOJ 1009:[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考试(dp+kmp+矩阵快速幂)

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

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

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

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

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

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

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

  6. BZOJ 1005: [HNOI2008]明明的烦恼

    BZOJ 1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线 ...

  7. GT考试(bzoj 1009)

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

  8. BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...

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

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

最新文章

  1. 第18章:MYSQL分区
  2. linux遭入侵挖矿进程被隐藏案例分析
  3. WinError 145] 目录不是空的
  4. 用C语言实现分治方法数组的排序,C语言实现分治法实例
  5. 扩展源_视觉框架SimpleCV - 图像源
  6. Android Lifecycle 生命周期组件详解
  7. Java特性-动态代理
  8. 【转载】Java中String类的方法及说明
  9. python起多进程服务_python 多进程详细总结
  10. kylin 系列介绍
  11. st语言和c语言一样,什么是ST语言,一文带你了解ST语言
  12. 如何同时使用双网卡进行两个网络上网
  13. github:配置ssh密钥
  14. java 加水印_Java添加水印(图片水印,文字水印)
  15. 兜兜转转,华为与李一男终于在汽车行业重逢,两者将展开决战?
  16. 根据身高体重计算BMI指数
  17. Linux私房菜--第三章 主机规划和磁盘分区
  18. 现代人的困扰,“高刺激”的诱惑
  19. Mathematica中将多个动态图合并在一起(包括自动与手动)
  20. 使用GNS3进行子网及路由的简单配置

热门文章

  1. python结束if else_python | if else || where true 流程控制
  2. python 流式编程_使用Python在两台计算机之间流式传输实时视频
  3. 企业网络推广期间影响企业网络推广自然排名的因素有哪些?
  4. 网站标题怎么写可以被搜索引擎快速识别?
  5. 网站标题如何设计才更有利于网站优化呢?
  6. linux 强制刷新文件,vim 如何刷新或重载reload 已打开的文件
  7. # 定义四边形_数学教研——认识四边形
  8. Android 机型适配之gradient默认渐变方向
  9. vim实用技巧-笔记(第九章)
  10. 自定义View开发时踩的坑