【AC自动机】文本生成器
【题目链接】
【题意】
给出长度为m,n个模式串,请问只要长度为m的串中有一个模式串就算是可读。
【分析】
其实如果直接分析全部可读的情况,一个串,两个串,……n个串可读。
明显是很复杂而且是做不出来的。
正难则反,其实我们可以需要通过一个(所有可能-全部不可读的情况)不就是答案的方案吗?
记录不合法的方案,考虑dp[i][j] ,下标为j,长度为i 的不可读的情况。
其实不可读的情况就是不经过结尾的结点即可。
最后答案就是利用26个字母,然后子节点通过父节点来累加答案。
最后把对立事件算出来即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std;
const int N = ;
const int M = 2e6+;
const int mod = ;
int Trie[M][] , fail[M] , End[M], idx ;
int Q[M] , Head , Tail ;
int f[N][N];
int n ,m ; char str[N]; void Insert( char s[] ){
int p = ;
for(int i= ; s[i] ; i++ ){
int t = s[i] - 'A' ;
if( !Trie[p][t] )
Trie[p][t] = ++idx ;
p = Trie[p][t];
}
End[p] |= ;
} void Build(){
Head = , Tail = ;
for(int i=;i<;i++)
if(Trie[][i])
Q[++Tail] = Trie[][i] ; while( Head <= Tail ){
int u = Q[Head++] ;
for(int i=;i<;i++){
int To = Trie[u][i];
if( To ){
fail[To] = Trie[fail[u]][i];
Q[++Tail] = To; End[To] |= End[fail[To]] ;
}else{
Trie[u][i] = Trie[fail[u]][i];
}
}
} } void Solve(){
f[][] = ;
for(int i=;i<=m;i++){
for(int j=;j<=idx;j++){
for(int k=;k<;k++){
int To = Trie[j][k];
if( !End[To] ){
(f[i][To] += f[i-][j]) %= mod ;
}
}
}
}
int tot = ;
for(int i=;i<=idx;i++){
tot = (tot+f[m][i]) % mod ;
}
int sum = ;
for(int i=;i<=m;i++){
sum = sum * % mod ;
}
printf("%d\n",(sum-tot+mod)%mod );
}
int main()
{
ios_base :: sync_with_stdio(false);
cin.tie() , cout.tie();
cin >> n >> m ;
for(int i=;i<n;i++){
cin >> str ;
Insert(str);
}
Build();
Solve();
return ;
}
【AC自动机】文本生成器的更多相关文章
- HDOJ-2896(AC自动机+文本串中出现了哪几个模板串)
病毒侵袭 HDOJ-2896 主要使用AC自动机解决,其次在query函数中改变一下,用来记录每个模板串出现的次数,还有insert函数中记录模板串的编号 需要注意最好使用结构体,而且不能一次性使用m ...
- AC自动机入门
Aho-Corasick automaton,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. KMP算法很好的解决了单模式匹配问题,如果有了字典树的基础,我们可以完美的结合二者解决多 ...
- 【BZOJ-1030】文本生成器 AC自动机 + DP
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3253 Solved: 1330[Submit][Stat ...
- BZOJ_1030_[JSOI2007]_文本生成器_(AC自动机+DP)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1030 给出一些单词,问长度为\(m\)的文章有多少文章中出现过任意一个或多个单词. 分析 文章 ...
- 【BZOJ1030】文本生成器(AC自动机,动态规划)
[BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
- 【BZOJ】1030: [JSOI2007]文本生成器(递推+ac自动机)
http://www.lydsy.com/JudgeOnline/problem.php?id=1030 其实做了1009也不会感到很难了,无非将kmp变成了ac自动机. 设f[i,j]表示前i个串当 ...
- 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
随机推荐
- Go语言 之TCP文件传输
服务端实现流程大致如下: 创建监听listener,程序结束时关闭. 阻塞等待客户端连接,程序结束时关闭conn. 读取客户端发送文件名.保存fileName. 回发“ok”给客户端做应答 封装函数 ...
- C#程序调用CMD执行命令,将参数传递给cmd.exe
proc.StartInfo.Arguments = "/c ping 10.2.2.125"; C#程序调用CMD执行命令 将参数传递给cmd.exe的(Passing an a ...
- Python语法 - yield表达式(类似 m = yield i )
yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法, yield表达式可以接收send()发出的参数,yield表达式是跟send方法一起配合使用 send方 ...
- HTTP之实体和编码
1. Content-Length: 实体的大小 Content-Length 首部指示出报文中实体主体的字节大小.这个大小是包含了所有内容编码的,比如,对文本文件进行了 gzip 压缩的话,Cont ...
- 区间dp括号匹配
POJ2955 匹配则加一,不需要初始化 //#include<bits/stdc++.h> #include<iostream> #include<cstdio> ...
- Qt configure 参数
在编译QT前,可加各种参数来定制自己想要的QT库.这对需要裁减QT库的朋友来说非常重要.对于如何编译QT,可以参考:http://hi.baidu.com/agassi%5Fp/blog/item/4 ...
- php中_initialize()函数与 __construct()函数的区别说明
_initialize()方法是在任何方法执行之前,都要执行的,当然也包括 __construct构造函数. 也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initial ...
- 【SpringBoot】SpringBoot/MyBatis/MySql/thymeleaf/Log4j整合工程
工程下载地址:https://files.cnblogs.com/files/xiandedanteng/MMSpringWeb20191027-1.rar 工程目录结构如图: 1.创建工程 有些网文 ...
- UML期末复习题——2.7:UML Sequence Diagram
第七题:顺序图 重要概念: 1. 顺序图的主要介绍,在之前对第5题“系统顺序图”的解析讲解里已经很详细了,在这里只是对部分不全面的内容进行补充. 第五题:系统顺序图&后置条件 http://w ...
- Servlet的运行原理