dp[i][j] 表示,在AC自动机中,从根节点开始,走了i条边,并且经过的点不包含危险节点,走到了j节点的路径数。

收获:

  1、正难则反

  2、一个字符串不包含给定pattern中的任何一个,则该字符串在AC自动机上走时不会走到“危险节点”。

  3、DFS可以做的事情,可以考虑DP来做。

 #include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#define fprintf(...)
#define M 10007
#define maxn 6010
using namespace std; int n, len;
int son[maxn][], fail[maxn], ikey[maxn], ntot;
int dp[][maxn]; void insert( const char *P ) {
int n=strlen(P);
int u=;
for( int i=; i<n; i++ ) {
int c=P[i]-'A';
if( !son[u][c] ) son[u][c]=++ntot;
fprintf( stderr, "%d->%d %c\n", u, son[u][c], c+'a' );
u=son[u][c];
}
ikey[u] = true;
}
void build() {
queue<int> qu;
for( int c=; c<; c++ ) {
int v=son[][c];
if( !v ) continue;
qu.push( v );
fail[v] = ;
fprintf( stderr, "fail[%d] = %d\n", v, fail[v] );
}
while( !qu.empty() ) {
int u=qu.front();
qu.pop();
for( int c=; c<; c++ ) {
int v=son[u][c];
int w=fail[u];
if( !v ) {
son[u][c] = son[fail[u]][c];
fprintf( stderr, "%d->%d %c\n", u, son[u][c], c+'a' );
} else {
while( w && !son[w][c] ) w=fail[w];
fail[v] = son[w][c];
fprintf( stderr, "fail[%d] = %d\n", v, fail[v] );
ikey[v] |= ikey[fail[v]];
qu.push( v );
}
}
}
}
void work() {
dp[][] = ;
for( int i=; i<=len; i++ )
for( int u=; u<=ntot; u++ )
if( dp[i][u] ) {
fprintf( stderr, "dp[%d][%d] = %d\n", i, u, dp[i][u] );
for( int c=; c<; c++ ) {
int v=son[u][c];
if( ikey[v] ) continue;
dp[i+][v] += dp[i][u];
if( dp[i+][v]>=M ) dp[i+][v]-=M;
}
}
int ans = ;
for( int i=; i<=len; i++ )
ans = (ans*)%M;
for( int u=; u<=ntot; u++ ) {
ans -= dp[len][u];
if( ans< ) ans+=M;
}
printf( "%d\n", ans );
}
int main() {
scanf( "%d%d", &n, &len );
for( int i=; i<=n; i++ ) {
char str[];
scanf( "%s", str );
insert( str );
}
build();
work();
}

bzoj 1030的更多相关文章

  1. BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3953  Solved: 1614[Submit][Stat ...

  2. bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...

  3. BZOJ 1030 [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2624  Solved: 1087[Submit][Stat ...

  4. BZOJ 1030 [JSOI2007]文本生成器(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...

  5. bzoj 1030 ac自动机

    比较容易看出来先建立ac自动机,然后在自动机上做DP,设w[0..1][i][j]为当前不包括/包括字典中的字符串,当前在自动机中走到第i个节点,完成的文本的长度为j的方案数,那么比较容易的转移w[i ...

  6. BZOJ 1030 文本生成器 | 在AC自动机上跑DP

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=1030 题解: 鸽 #include<cstdio> #include<al ...

  7. bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2635  Solved: 1090 [id=1030&qu ...

  8. 【BZOJ 1030】[JSOI2007]文本生成器

    [题目链接]:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1030 [题意] [题解] /* 先把AC自动机搞出来; 然后利用AC自动机,把 ...

  9. BZOJ 1030 【JSOI2007】 文本生成器

    Description JSOI交给队员ZYX一个任务,编制一个称之为"文本生成器"的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生 ...

  10. 【BZOJ 1030】【JSOI 2007】文本生成器 AC自动机+递推

    一直不理解到底怎么做啊,想了好久$TwT$ 最后终于明白了为什么找到第一个满足条件的$fail$就计算,因为避免重复,这个回答,,, 然后$root$下面要接上26个节点,这里26个字母中不在字典内的 ...

随机推荐

  1. NYOJ 231 Apple Tree (树状数组)

    题目链接 描述 There is an apple tree outside of kaka's house. Every autumn, a lot of apples will grow in t ...

  2. redis中插入用户集合的语句,有四个属性

    一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 ...

  3. HBA 介绍

    1.首先介绍一下什么是HBA. 这里所说的HBA,全称FC HBA,也就是Fibre Channel Host Bus Adapter.在FC网络中,主机(如服务器)需要和FC网络.FC存储设备(如S ...

  4. 简单漂亮的php验证码函数

    /* *说明:函数功能是生成验证码 * 参数说明:输入 长度,宽度,高度 */ function vcode($_code_length = , $_width = , $_height = ){ $ ...

  5. OSCP考试回顾

    技术背景 从2011年开始接触学习渗透测试,全职做过的职位有渗透测试,Python后端研发,DevOps,甲方安全打杂. 学习过程 首先考试报名,交钱.买了价值800美元的一个月lab,包含Pente ...

  6. 关于parse_str变量覆盖分析

    这个漏洞有两个姿势.一个是不存在的时候一个是存在的时候. 经过测试该漏洞只在php5.2中存在,其余均不存在. 倘若在parse_str函数使用的代码上方未将其定义那么即存在变量覆盖漏洞否则不行. 还 ...

  7. 21.Merge Two Sorted Lists---《剑指offer》面试17

    题目链接:https://leetcode.com/problems/merge-two-sorted-lists/description/ 题目大意: 给出两个升序链表,将它们归并成一个链表,若有重 ...

  8. Deep Learning基础--各个损失函数的总结与比较

    损失函数(loss function)是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值函数,通常使用L(Y, f(x))来表示,损失函数越小,模型的鲁棒性就越好.损失函数是经验 ...

  9. Guava cache功能简介(转)

    原文链接:http://ifeve.com/google-guava-cachesexplained/ 范例 LoadingCache<Key, Graph> graphs = Cache ...

  10. int类中的方法

    我们知道在python中,一切对象都是类,对象的方法都封装在类中,现在来探讨一下int类中的方法: 我们可以通过help(int)和dir(int)来查看int类中都封装了那些方法:     1.bi ...