#include <cstdio>
#include <queue>
#include <cstring>
using namespace std; const int mo=; int cnt; int trie[][];
int val[];
int f[],last[];
int n,m;
char st[][];
int tmp[];
int dp[][][]; int newnode(){
return(++cnt);
} void ins(int a[],int len){
int t=;
for (int i=;i<=len;i++){
if (trie[t][a[i]]==) t=trie[t][a[i]]=newnode();else
t=trie[t][a[i]];
}
val[t]=;
} queue <int> q;
void getfail(){
for (int i=;i<=;i++)
if (trie[][i]){
q.push(trie[][i]);
f[trie[][i]]=last[trie[][i]]=;
} while (!q.empty()){
int t=q.front();q.pop();
for (int i=;i<=;i++){
int u=trie[t][i];
if (u==) {trie[t][i]=trie[f[t]][i];continue;}
q.push(u);
f[u]=trie[f[t]][i];
if (val[f[u]]) last[u]=f[u]/*,val[u]=1*/;else last[u]=last[f[u]];
}
}
} int main(){
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++){
scanf("%s",&st[i]);
int le=strlen(st[i]);
for (int j=;j<=le;j++) tmp[j]=st[i][j-]-'A'+;
ins(tmp,le);
} getfail(); dp[][][]=;
for (int i=;i<m;i++)
for (int j=;j<=cnt;j++){
if (dp[i][j][]){
for (int k=;k<=;k++)
if (val[trie[j][k]])
dp[i+][trie[j][k]][]+=dp[i][j][],dp[i+][trie[j][k]][]%=mo;else
dp[i+][trie[j][k]][]+=dp[i][j][],dp[i+][trie[j][k]][]%=mo;
}
if (dp[i][j][]){
for (int k=;k<=;k++)
dp[i+][trie[j][k]][]+=dp[i][j][],dp[i+][trie[j][k]][]%=mo;
}
} int ans=;
for (int i=;i<=cnt;i++)
ans+=dp[m][i][],ans%=mo; printf("%d\n",ans);
}

自动机中一个节点对应了多个串,如此题中虽在字典树中非叶子节点,但可能对应了一个串

例:abab,ba,在到达找寻aba时实际已找到ba

AC自动机(BZOJ1030)的更多相关文章

  1. 【BZOJ1030】文本生成器(AC自动机,动态规划)

    [BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...

  2. BZOJ1030 [JSOI2007]文本生成器 AC自动机 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意, ...

  3. 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划

    [BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...

  4. 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP

    [bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...

  5. 【BZOJ-1030】文本生成器 AC自动机 + DP

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3253  Solved: 1330[Submit][Stat ...

  6. [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)

    Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...

  7. bzoj1030: [JSOI2007]文本生成器(AC自动机+DP)

    第一次写这类题...懵 直接计算答案不好计算,所以补集转化求不合法的方案. 首先考虑朴素的DP,设$f(i, s)$表示前$i$个字符,字符串为$s$的方案数,且任意一个给定串都不存在$s$中. 我们 ...

  8. BZOJ1030 [JSOI2007]文本生成器(AC自动机)

    做到了AC自动机的题目,复习了一下AC自动机,学习了黄学长代码,这个题呢,我们可以模拟在AC自动机上的操作,dp数组f[i][j]表示前i个字符,我们在AC自动机上处在j号节点的方案数. 我们可以计算 ...

  9. 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp

    题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...

随机推荐

  1. jq样式方法总结

    .html()方法 获取集合中第一个匹配元素的HTML内容 或 设置每一个匹配元素的html内容,具体有3种用法: .html() 不传入值,就是获取集合中第一个匹配元素的HTML内容 .html( ...

  2. Java怎么导入一个项目?

    1.首先安装  >>  Java开发环境MyEclipse或者Eclipse.(我用的是Myeclipse) 2.打开  >>  MyEclipse  >>  fi ...

  3. ORACLE 9i 数据库体系结构图

    ORACLE 9i 的数据库体系结构图,非常的全面.系统.高屋建瓴的整体介绍了ORACLE 9i 的数据库体系结构.如果能全面了解.清晰梳理.深入掌握这些知识点,相信对你了解学习.深入研究ORACLE ...

  4. ORACLE回收站机制介绍

    回收站概念 从ORACLE 10g开始,引入了一个叫回收站(Recycle Bin)的概念.它的全称叫Tablespace Recycle Bin.回收站实际是一个逻辑容器(逻辑区域),原理有点类似于 ...

  5. ORA-00824: cannot set sga_target due to existing internal settings, see alert log for more information

    这篇文章是上篇文章”Expdp 导数错误 ORA-00832”的延续,前几天工作比较忙.累,直到今天才整理发出来.这个数据库实例的参数设置比较诡异其实是有原因的,由于这台数据库服务器系统是32位,数据 ...

  6. Linux 硬盘分区生效命令partprobe

    在Linux中使用fdisk命令进行分区时,有时会遇到"WARNING: Re-reading the partition table failed with error 16: Devic ...

  7. C语言--乱写C语言

    C语言的语法太枯燥了 换个写法   #include <stdio.h> #include<stdlib.h> #define end } #define if(x) if ( ...

  8. postgres扩展开发

    扩展开发的基本组成 demo--1.0.sql demo.c demo.control Makefile demo.c当中包含了自定义函数的实现,纯C语言,目录下可包含多个.c文件.demo-1.0. ...

  9. MongoDB学习笔记~批量插入方法的实现

    回到目录 批量插入在EF时代大叔就自己封装过,原理是将多次SQL连接和多次向SQL发送的指令减少到1次,或者1000条数据1次,而对于EF产生的语句来说,这无疑是性能高效的,因为EF这边在处理时,每个 ...

  10. php 上传文件

    $_FILES["file"]["name"] - 被上传文件的名称 $_FILES["file"]["type"] - ...