#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. js => ES6一个新的函数写法

    今天在网上参观到一个写法,返回字符串个个字母的个数 var arr='aaabbccaa'; var info = arr.split('').reduce((p, k) => (p[k]++ ...

  2. 1-2 nodejs小节 文件读取

    1.表达式 在命令行输入  node回车后,可以在后边输入相应的表达式,进行运算操作   2.阻塞文件读取 var data=fs.readFileSync('input.txt', 'utf-8') ...

  3. Linux-HA实战(1)— Heartbeat安装

    接触Heartbeat主要是因为之前项目中使用了TFS,最近想给nameserver做HA,因为TFS官方用的Heartbeat,所以刚好了解下,参考了网络上很多内容,这里简单记录下. 内容 环境和软 ...

  4. HIVE 在执行大量数据JOIN的时候,容易产生内存不足的情况

    情况 很多时间遇到 "Caused by: java.lang.OutOfMemoryError: Java heap space" Caused by: java.lang.Ou ...

  5. IOS开发基础知识--碎片13

    1:运行程序报the file couldn't be opened because you don't have permission to view it 解决办法:项目—>targets- ...

  6. React Native知识3-TextInput组件

    TextInput是一个允许用户在应用中通过键盘输入文本的基本组件.本组件的属性提供了多种特性的配置,譬如自动完成.自动大小写.占位文字,以及多种不同的键盘类型(如纯数字键盘)等等.它的样式属性跟Te ...

  7. 极光推送-适配 iOS10

    //************************ iOS10 适配 **************************// //************************ 11/02/20 ...

  8. 【转】Android Studio下加入百度地图的使用 (一)——环境搭建

    最近有学 生要做毕业设计,会使用到定位及地图信息的功能,特此研究了一下,供大家参考,百度定位SDK已经更新到了5.0,地图SDK已经更新到了3.5,但是在 AndroidStudio中使用还是存在一些 ...

  9. 使用adjacent_difference要注意的小问题

    adjacent_difference的源与目的地可以相同,这是在标准中说明的,所以我产生了疑问,会不会因为这样使用而改变了当前成员,而影响下一步计算呢,经试验,在vs2015里并不会. #inclu ...

  10. Play Framework 完整实现一个APP(九)

    添加增删改查操作 1.开启CRUD Module 在/conf/application.conf 中添加 # Import the crud module module.crud=${play.pat ...