AC自动机(BZOJ1030)
#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)的更多相关文章
- 【BZOJ1030】文本生成器(AC自动机,动态规划)
[BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...
- BZOJ1030 [JSOI2007]文本生成器 AC自动机 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意, ...
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
- 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP
[bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...
- 【BZOJ-1030】文本生成器 AC自动机 + DP
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3253 Solved: 1330[Submit][Stat ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- bzoj1030: [JSOI2007]文本生成器(AC自动机+DP)
第一次写这类题...懵 直接计算答案不好计算,所以补集转化求不合法的方案. 首先考虑朴素的DP,设$f(i, s)$表示前$i$个字符,字符串为$s$的方案数,且任意一个给定串都不存在$s$中. 我们 ...
- BZOJ1030 [JSOI2007]文本生成器(AC自动机)
做到了AC自动机的题目,复习了一下AC自动机,学习了黄学长代码,这个题呢,我们可以模拟在AC自动机上的操作,dp数组f[i][j]表示前i个字符,我们在AC自动机上处在j号节点的方案数. 我们可以计算 ...
- 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
随机推荐
- js => ES6一个新的函数写法
今天在网上参观到一个写法,返回字符串个个字母的个数 var arr='aaabbccaa'; var info = arr.split('').reduce((p, k) => (p[k]++ ...
- 1-2 nodejs小节 文件读取
1.表达式 在命令行输入 node回车后,可以在后边输入相应的表达式,进行运算操作 2.阻塞文件读取 var data=fs.readFileSync('input.txt', 'utf-8') ...
- Linux-HA实战(1)— Heartbeat安装
接触Heartbeat主要是因为之前项目中使用了TFS,最近想给nameserver做HA,因为TFS官方用的Heartbeat,所以刚好了解下,参考了网络上很多内容,这里简单记录下. 内容 环境和软 ...
- HIVE 在执行大量数据JOIN的时候,容易产生内存不足的情况
情况 很多时间遇到 "Caused by: java.lang.OutOfMemoryError: Java heap space" Caused by: java.lang.Ou ...
- IOS开发基础知识--碎片13
1:运行程序报the file couldn't be opened because you don't have permission to view it 解决办法:项目—>targets- ...
- React Native知识3-TextInput组件
TextInput是一个允许用户在应用中通过键盘输入文本的基本组件.本组件的属性提供了多种特性的配置,譬如自动完成.自动大小写.占位文字,以及多种不同的键盘类型(如纯数字键盘)等等.它的样式属性跟Te ...
- 极光推送-适配 iOS10
//************************ iOS10 适配 **************************// //************************ 11/02/20 ...
- 【转】Android Studio下加入百度地图的使用 (一)——环境搭建
最近有学 生要做毕业设计,会使用到定位及地图信息的功能,特此研究了一下,供大家参考,百度定位SDK已经更新到了5.0,地图SDK已经更新到了3.5,但是在 AndroidStudio中使用还是存在一些 ...
- 使用adjacent_difference要注意的小问题
adjacent_difference的源与目的地可以相同,这是在标准中说明的,所以我产生了疑问,会不会因为这样使用而改变了当前成员,而影响下一步计算呢,经试验,在vs2015里并不会. #inclu ...
- Play Framework 完整实现一个APP(九)
添加增删改查操作 1.开启CRUD Module 在/conf/application.conf 中添加 # Import the crud module module.crud=${play.pat ...