【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版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
随机推荐
- Java 使用线程池分批插入或者更新数据
需求:在开发业务报表时,需要从MySQL数据库读取数据后进行操作,然后写入数据库,使用定时任务跑批. 分析:①兼顾性能,② MySQL没有Oracle那么方便.强大的存储过程.综上所述,使用线程池以 ...
- CF1214B
CF1214B 解法: 暴力枚举,时间复杂度 $ O(n) $ CODE: #include<iostream> #include<cstdio> #include<cs ...
- delphi nethttpclient操作cookie
delphi nethttpclient操作cookie unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysU ...
- UML期末复习题——2.5:System Sequence Diagram & Post-condition
第五题:系统顺序图 重要概念: 1.对象: 对象是特定行为与属性的集合. 对象的表示方式有三种: a.包括对象名和类名 b.只有类名. c.只有对象名 2.消息表示形式: 消息用于描述对象间交互的方式 ...
- dnspy使用技巧
打开dnspy,调试–>附加到进程–>选择相应的进程ID–>附加(支持同时附加多个进程) 调试–>窗口–>模块–>搜索要调试的程序集–>双击(这一步很重要, ...
- kotlin 类的继承
与Java不同,kotlin 使用冒号,而Java 中使用extends, 注意冒号后面需要调用夫类的构造器.属于单继承,使用open 关键字允许继承class package loaderman.d ...
- Eclipse项目修改编译jdk版本(Failed to read candidate component class: file 处理)
转: Failed to read candidate component class: file 处理 2018年03月09日 07:15:54 爱萨萨 阅读数 10041 出错现象: org. ...
- sql控制流if()、case when then
tb_user: 1.if (expr1,expr2,expr3) #如果expr1成立,则返回expr2,否则返回expr3示例:select name, if (sex=1,'男','女') ...
- 用Keras搭建神经网络 简单模版(五)——RNN LSTM Regressor 循环神经网络
# -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) import matplotlib.pyplot as plt from ...
- WPS--world使用格式刷
1.在空白处左键点击一下即可出现格式刷