BZOJ 1009 GT考试
Description
阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字。他的不吉利数学A1A2...Am(0<=Ai<=9)有M位,不出现是指X1X2...Xn中没有恰好一段等于A1A2...Am. A1和X1可以为0
Input
第一行输入N,M,K.接下来一行输入M位的数。 100%数据N<=10^9,M<=20,K<=1000 40%数据N<=1000 10%数据N<=6
Output
阿申想知道不出现不吉利数字的号码有多少种,输出模K取余的结果.
Sample Input
111
Sample Output
HINT
Source
利用“不吉利数字”构建ac自动机(我好像小题大做了,一个串好像没有必要),构建初始矩阵,接着矩阵乘法即可。
初始矩阵a[i][j]表示走一步从i节点走到j节点的方案数。
code:
- #include<vector>
- #include<queue>
- #include<cstring>
- #include<cstdio>
- #include<cstdlib>
- using namespace std;
- #define maxm 25
- char buf[maxm];
- int n,m,rhl,ans;
- struct node
- {
- int a[maxm*maxm][maxm*maxm],n,m;
- node() {memset(a,,sizeof(a));n = m = ;}
- friend node operator *(node x,node y)
- {
- node z; z.n = x.n; z.m = y.m;
- int i,j,k;
- for (i = ;i <= z.n;++i)
- for (j = ;j <= z.m;++j)
- for (k = ;k <= x.m;++k)
- (z.a[i][j] += (long long)x.a[i][k]*(long long)y.a[k][j]%rhl)%=rhl;
- return z;
- }
- inline node quick(node x,int k)
- {
- node ret; ret.n = x.n; ret.m = x.m;
- for (int i = ;i <= ret.n;++i) ret.a[i][i] = ;
- for (;k;k>>=,x = x*x)
- if (k & )
- ret = ret*x;
- return ret;
- }
- inline void calc() { for (int i = ;i <= m;++i) (ans += a[][i])%=rhl; }
- }s;
- struct trie
- {
- int next[maxm][],fail[maxm],L,root;
- bool end[maxm];
- inline int newnode()
- {
- memset(next[L],-,sizeof(next[L]));
- return ++L-;
- }
- inline void init() {L = ; root = newnode();}
- inline void insert()
- {
- int len = strlen(buf),now = root,i;
- for (i = ;i < len;++i)
- {
- if (next[now][buf[i]-''] == -) next[now][buf[i]-''] = newnode();
- now = next[now][buf[i]-''];
- }
- end[now] = true;
- }
- inline void build()
- {
- int now = root,i; queue <int> team;
- fail[root] = root;
- for (i = ;i < ;++i)
- if (next[now][i] == -) next[now][i] = root;
- else fail[next[now][i]] = root,team.push(next[now][i]);
- while (!team.empty())
- {
- now = team.front(); team.pop();
- for (i = ;i < ;++i)
- if (next[now][i] == -) next[now][i] = next[fail[now]][i];
- else fail[next[now][i]] = next[fail[now]][i],team.push(next[now][i]);
- }
- }
- inline void ready()
- {
- vector <int> son[maxm]; queue <int> team; int i,now,v,nn;
- for (i = ;i < L;++i) if (fail[i] != i) son[fail[i]].push_back(i);
- team.push(root);
- while (!team.empty())
- {
- now = team.front(); team.pop();
- nn = son[now].size();
- for (i = ;i < nn;++i)
- {
- v = son[now][i];
- if (end[now]) end[v] = true;
- team.push(v);
- }
- }
- }
- inline void make()
- {
- int i,j; s.n = s.m = L;
- for (i = ;i < L;++i)
- {
- if (end[i]) continue;
- for (j = ;j < ;++j)
- if (!end[next[i][j]]) s.a[i+][next[i][j]+]++;
- }
- }
- }ac;
- int main()
- {
- freopen("1009.in","r",stdin);
- freopen("1009.out","w",stdout);
- scanf("%d %d %d\n",&n,&m,&rhl);
- ac.init();
- scanf("%s",buf); ac.insert();
- ac.build(); ac.ready(); ac.make();
- s = s.quick(s,n); s.calc();
- printf("%d",ans);
- fclose(stdin); fclose(stdout);
- return ;
- }
BZOJ 1009 GT考试的更多相关文章
- BZOJ 1009 GT考试(ac自动机+矩阵DP)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1009 题意:给定一个长度为m的串s.有多少种长度为n的串不包含s? 思路:(1)将s插入 ...
- BZOJ 1009 GT考试 (AC自动机 + 矩阵乘法加速dp)
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1009 题意: 准考证号为\(n\)位数\(X_1X_2....X_n(0<=X_ ...
- bzoj 做起走 -- bzoj 1009 GT 考试
现在每次做一道bzoj上的题,整个人都感觉升华了... 先是在网上各种搜题解.要么只有代码,要么有点讲解看不懂,对于从来没有耐心看完别人代码的我,只能一篇一篇的翻..然后终于在某2011级同学的某段话 ...
- [BZOJ 1009] [HNOI2008] GT考试 【AC自动机 + 矩阵乘法优化DP】
题目链接:BZOJ - 1009 题目分析 题目要求求出不包含给定字符串的长度为 n 的字符串的数量. 既然这样,应该就是 KMP + DP ,用 f[i][j] 表示长度为 i ,匹配到模式串第 j ...
- BZOJ 1009: [HNOI2008]GT考试( dp + 矩阵快速幂 + kmp )
写了一个早上...就因为把长度为m的也算进去了... dp(i, j)表示准考证号前i个字符匹配了不吉利数字前j个的方案数. kmp预处理, 然后对于j进行枚举, 对数字0~9也枚举算出f(i, j) ...
- BZOJ 1009 HNOI 2008 GT考试 递推+矩乘
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3679 Solved: 2254[Submit][Statu ...
- BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4266 Solved: 2616[Submit][Statu ...
- bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...
- GT考试(bzoj 1009)
Description 阿申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学A1A2...Am(0< ...
随机推荐
- 尝鲜basic开发android
做过android开发的同学都知道,很大精力都需要去面对界面编程,这个是非常没效率非常痛苦的一件事.偶然得知basic老树发新芽,居然还可以做android开发,决定试试效果如何. 首先上:http: ...
- [RxJS] Transformation operator: scan
All of the combination operators take two or more observables as input. These operators may also be ...
- [RxJS] Filtering operators: skipWhile and skipUntil
After takeUntil() and takeWhile() function, let's have a look on skipWhile() and skilUntil() functio ...
- Web classPath
classpath,看名字,类路径,这样比如,对于java程序,就是告诉java程序哪里去找类.(java虚拟机都是通过类装载器的)想myeclipse中struts,spring,hibernate ...
- android开发之Notification学习笔记
今天总结了一下Notification的使用,与大家分享一下. MainActivity.java: 本文参考:http://www.jb51.net/article/36567.htm,http:/ ...
- eclipse4.3 kepler中安装maven
1.软件准备 a:Eclipse 4.3 http://www.eclipse.org/downloads/ b:maven http://maven.apache.org/download.cgi ...
- Junit简介和常用API
测试几个的概念 白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的. 回归测试——软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用. 单元测试 ...
- ZOJ 3905 Cake(贪心+dp)
动态规划题:dp[i][j]表示有i个Cake,给了Alice j个,先按照b排序,这样的话,能保证每次都能成功给Alice Cake,因为b从大到小排序,所以Alice选了j个之后,Bob最少选了j ...
- gamit10.6问题汇总
1.在处理精密星历时,提示:old version of file not supported (name svnav.dat) 解决办法:在gamit10.5中不会出现这个问题,10.6中的官方文档 ...
- SQLite 入门教程(四)增删改查,有讲究
增删改查操作,其中增删改操作被称为数据操作语言 DML,相对来说简单一点. 查操作相对来说复杂一点,涉及到很多子句,所以这篇先讲增删改操作,以例子为主,后面再讲查操作. 一.插入数据 INSERT I ...