[bzoj1030][JSOI2007]文本生成器——AC自动机
Brief Description
给定一些模式串,您需要求出满足以下要求的字符串的个数。
- 长度为m
- 包含任意一个模式串
Algorithm Design
以下内容来自神犇博客
首先运用补集转换,转而求不含这些串的个数,最后用26^M减掉就行
根据输入的字符串建立AC自动机
dp[i][j]表示当前考虑了i位,当前停留在AC自动机的j号节点
每一次可以由dp[i][j]转移到dp[i+1][k],k是枚举第i+1为后作为j的儿子在AC自动机上的编号
枚举k,就是第i+1为填什么,然后进行下列操作:
首先看看这位能不能填k,判断方法是从j开始向fail[j]跳,看是不是有一个j有一个k儿子,并且k儿子上还有结束标记,只要有一个就证明如果i+1位填k就会让整个字符串出现AC自动机上的字符串,所以不能填k
如果能放,再看看要修改哪个dp数组。
还是从j开始向fail[j]跳,如果j有k这个儿子就直接修改dp[i+1][j的k儿子]就好
每次修改要对修改目标加上dp[i][j]
答案是所有dp[m][x](x是所有AC自动机上的节点)的和
Code
#include <cstdio>
#include <cstring>
#include <queue>
#define mod 10007
const int maxn = 6010;
int a[maxn][27], f[101][maxn], point[maxn];
int n, m, sz = 1;
char s[101];
bool leaf[maxn];
void insert(char s[101]) {
int now = 1, c;
for (int i = 0; i < strlen(s); i++) {
c = s[i] - 'A' + 1;
if (a[now][c])
now = a[now][c];
else
now = a[now][c] = ++sz;
}
leaf[now] = 1;
}
void ac() {
std::queue<int> q;
q.push(1);
point[1] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 1; i <= 26; i++) {
if (!a[u][i])
continue;
int k = point[u];
while (!a[k][i])
k = point[k];
point[a[u][i]] = a[k][i];
if (leaf[a[k][i]])
leaf[a[u][i]] = 1;
q.push(a[u][i]);
}
}
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input", "r", stdin);
#endif
scanf("%d %d", &n, &m);
for (int i = 1; i <= 26; i++)
a[0][i] = 1;
for (int i = 1; i <= n; i++) {
scanf("%s", s);
insert(s);
}
ac();
f[0][1] = 1;
for (int x = 1; x <= m; x++)
for (int i = 1; i <= sz; i++) {
if (leaf[i] || !f[x - 1][i])
continue;
for (int j = 1; j <= 26; j++) {
int k = i;
while (!a[k][j])
k = point[k];
f[x][a[k][j]] = (f[x][a[k][j]] + f[x - 1][i]) % mod;
}
}
int ans1 = 0, ans2 = 1;
for (int i = 1; i <= m; i++)
ans2 = (ans2 * 26) % mod;
for (int i = 1; i <= sz; i++) {
if (!leaf[i])
ans1 = (ans1 + f[m][i]) % mod;
}
// printf("%d %d\n", ans2, ans1);
printf("%d\n", (ans2 - ans1 + mod) % mod);
return 0;
}
[bzoj1030][JSOI2007]文本生成器——AC自动机的更多相关文章
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- BZOJ1030[JSOI2007]文本生成器——AC自动机+DP
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- BZOJ1030 [JSOI2007]文本生成器 AC自动机 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1030 题意概括 给出n个模式串,问长度为m的串中有多少个至少含有这n个模式串中的任意一个. 注意, ...
- BZOJ1030: [JSOI2007]文本生成器(AC自动机)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 5984 Solved: 2523[Submit][Status][Discuss] Descripti ...
- [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...
- 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划
[BZOJ1030][JSOI2007]文本生成器 Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文 ...
- 【BZOJ-1030】文本生成器 AC自动机 + DP
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3253 Solved: 1330[Submit][Stat ...
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
随机推荐
- 【APUE】Chapter16 Network IPC: Sockets & makefile写法学习
16.1 Introduction Chapter15讲的是同一个machine之间不同进程的通信,这一章内容是不同machine之间通过network通信,切入点是socket. 16.2 Sock ...
- springmvc基础篇—处理图片静态资源文件
当我们在web.xml中对DispatcherServlet的过滤设置为/ 的时候,表示对所有的路径进行拦截过滤,那么不可避免的就会产生一个问题,那就是像图片这种静态资源文件我明明引用路径有,但就是加 ...
- C++ STL容器——stack用法介绍
stack是一种容器适配器,专门设计用于在LIFO上下文中操作(后进先出),其中元素仅从容器的一端插入和删除. 容器适配器,而不是一种容器. 它是容器适配器是指,只要支持一系列方法的容器(empty, ...
- errno -4058 and npm WARN enoent ENOENT 解决方案
1.报错如下: npm WARN checkPermissions Missing write access to C:\Users\hejinrong\AppData\Roaming\npm\nod ...
- 最短路径——Bellman-Ford算法以及SPFA算法
说完dijkstra算法,有提到过朴素dij算法无法处理负权边的情况,这里就需要用到Bellman-Ford算法,抛弃贪心的想法,牺牲时间的基础上,换取负权有向图的处理正确. 单源最短路径 Bellm ...
- 使用window.getSelection()获取div中选中文字内容及位置
div添加一个弹出事件: $(document).ready(function () { $("#marked-area").mouseup(function (e) { $sco ...
- 【bzoj1412】[ZJOI2009]狼和羊的故事 网络流最小割
题目描述 “狼爱上羊啊爱的疯狂,谁让他们真爱了一场:狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈 ...
- 附录A培训实习生-面向对象基础构造方法和带参数的构造方法(2)
构造方法,又叫构造函数,其实就是对类进行实例化.构造方法与类同名,无返回值,也不需要void,在new时候调用.也就是说,就是调用构造方法的时候. 所有类都有构造方法,如果你不编码则系统默认生成空的的 ...
- C#判断字符串是否为数字字符串
在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,我们可以通过以下两种方法来实现.[方法一]:使用 try{} catch{} 语句. 我们可以在try语句块中试图将str ...
- hdu 2527 Safe Or Unsafe (哈夫曼树)
Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...