[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版. 该软件可以随机 ...
随机推荐
- EFT4 生成实体类
创建T4模本拷贝以下代码 <#@ template language="C#" debug="false" hostspecific="true ...
- CWindowWnd类源码分析
CWindowWnd代码在UIBase.h和UIBase.cpp文件里.主要实现的是一个基本窗口的创建与消息处理. 相关代码: 头文件: class UILIB_API CWindowWnd { pu ...
- Chrome 与 Firefox-Dev 的 DevTools
不管是做爬虫还是写 Web App,Chrome 和 Firefox 的 DevTools 都是超常用的,但是经常发现别人的截图有什么字段我找不到,别人的什么功能我的 Chrome 没有,仔细一搜索才 ...
- sendto函数的坑
测试unix数据报套接字时,一个程序收,一个程序发,分别绑定自己的socket.结果在收的部分,返回的发送方的地址总是空的,但是返回的地址长度又是对的. ) { bzero(&clientad ...
- 转:maven常用命令介绍
mvn 3.0.4 创建maven项目命令 mvn archetype:generate -DgroupId=damocles-autocredit -DartifactId=damocles ...
- BZOJ5011 [JXOI2017]颜色 【线段树 + 主席树】
题目链接 BZOJ5011 题解 一定只有我这种智障会用这么奇怪的方法做这道题.. 由题我们知道最后剩余的一定是一个区间,而且区间内的颜色不存在于区间外 所以我们的目的就是为了找到这样的区间的数量 区 ...
- [COGS 2089.] 平凡的测试数据 带权并查集
差点就撸上LCT了....... 带权并查集就是在并查集的基础上稍作修改,我的用穿址实现的有人用记录原父亲来实现. #include<cstdio> #define N 300010 us ...
- iOS 屏幕适配,autoResizing autoLayout和sizeClass图文详解
=== 1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iOS6之前完全可以胜任了,因为苹果手机只有3.5寸的屏幕,在加上手机app很少支持横屏,所以iOS ...
- Angular Cookie 读写
var app = angular.module('Mywind',['ui.router']) app.controller('Myautumn',function($scope,$http,$fi ...
- nc用法小记
By francis_hao Jun 30,2017 ncat:连接和重定向套接字 概要 ncat [OPTIONS...] [hostname] [port] 描述 ncat 是一个集 ...