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

4 3 100
111

Sample Output

81

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考试的更多相关文章

  1. BZOJ 1009 GT考试(ac自动机+矩阵DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1009 题意:给定一个长度为m的串s.有多少种长度为n的串不包含s? 思路:(1)将s插入 ...

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

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

  3. bzoj 做起走 -- bzoj 1009 GT 考试

    现在每次做一道bzoj上的题,整个人都感觉升华了... 先是在网上各种搜题解.要么只有代码,要么有点讲解看不懂,对于从来没有耐心看完别人代码的我,只能一篇一篇的翻..然后终于在某2011级同学的某段话 ...

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

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

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

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

  6. BZOJ 1009 HNOI 2008 GT考试 递推+矩乘

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3679  Solved: 2254[Submit][Statu ...

  7. BZOJ 1009 [HNOI2008]GT考试 (KMP + 矩阵快速幂)

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 4266  Solved: 2616[Submit][Statu ...

  8. bzoj 1009: [HNOI2008]GT考试 -- KMP+矩阵

    1009: [HNOI2008]GT考试 Time Limit: 1 Sec  Memory Limit: 162 MB Description 阿申准备报名参加GT考试,准考证号为N位数X1X2.. ...

  9. GT考试(bzoj 1009)

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

随机推荐

  1. Eclipse如何生成带有自定tag的Java Doc

    1. 选择要生成Java Doc的工程,单击鼠标右键,在弹出菜单中选择[Export],会弹出以下对话框: 2. 选择[Java]--->[Javadoc],点击[Next]按钮,弹出以下对话框 ...

  2. 常用的js效验

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. docker 镜像和容器的批量清理

    镜像和容器的清理 删除所有运行中的容器 $ docker kill $(docker ps -q) 删除所有停止的容器 $ docker rm $(docker ps -a -q) 删除所有没有tag ...

  4. Apache + Tomcat集群配置详解 (1)

    一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...

  5. [Node.js] Scraping Dynamic JavaScript Websites with Nightmare

    Many websites have more than just simple static content. Dynamic content which is rendered by JavaSc ...

  6. 初步掌握MapReduce的架构及原理

    目录 1.MapReduce定义 2.MapReduce来源 3.MapReduce特点 4.MapReduce实例 5.MapReduce编程模型 6.MapReduce 内部逻辑 7.MapRed ...

  7. css考核点整理(九)-有几种文字替换方式,之间的优缺点

    有几种文字替换方式,之间的优缺点

  8. CakePHP的文章分类的功能实现

    前些天实现了[微个人.大家园]的文章文类功能.现在回忆一下,是如何完成的吧. 具体的操作步骤如下: 1.在文章posts表里添加一个列,category_id. 2.在数据库中添加一个数据表,cate ...

  9. MVC+MEF+UnitOfWork+EF架构,网站速度慢的原因总结!(附加ANTS Memory Profiler简单用法)

    (最近使用内存分析工具ANTS Memory Profiler,以及其他网友提供的意见发现最终导致内存泄漏的就是MEF,在此特地更新下,与大家分享!最下面红色字体) 最近参考使用了郭明峰的一套架构来做 ...

  10. CSS美化 input type=file 兼容各个浏览器(转)

    HTML代码: <FORM> <A class=btn_addPic href="javascript:void(0);"><SPAN>< ...