Description

  JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,
他们现在使用的是GW文本生成器v6版。该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文
章—— 也就是说,生成的文章中每个字节都是完全随机的。如果一篇文章中至少包含使用者们了解的一个单词,
那么我们说这篇文章是可读的(我们称文章a包含单词b,当且仅当单词b是文章a的子串)。但是,即使按照这样的
标准,使用者现在使用的GW文本生成器v6版所生成的文章也是几乎完全不可读的?。ZYX需要指出GW文本生成器 v6
生成的所有文本中可读文本的数量,以便能够成功获得v7更新版。你能帮助他吗?

Input

  输入文件的第一行包含两个正整数,分别是使用者了解的单词总数N (<= 60),GW文本生成器 v6生成的文本固
定长度M;以下N行,每一行包含一个使用者了解的单词。这里所有单词及文本的长度不会超过100,并且只可能包
含英文大写字母A..Z

Output

  一个整数,表示可能的文章总数。只需要知道结果模10007的值。

Sample Input

2 2
A
B

Sample Output

100

HINT

Source

Solution

  和$BZOJ1009$类似,这题有多个模式串,所以先建出$AC$自动机

  $f[i][j]$表示长度为$i$匹配到自动机上第$j$个节点时的情况数,根据$f\!ail$指针的情况将$f[i]$转移到$f[i+1]$上

  那么答案就是总文章数减去所有不含模式串的情况数,当然有可能会出现一个模式串包含另一个模式串的情况,这种情况也要排除掉

  其实这个$dp$更像是在$trie$图上的转移

 #include <bits/stdc++.h>
using namespace std;
int trie[][], fail[], f[][], ptot, q[];
bool lst[];
char s[]; void insert()
{
int now = ;
for(int i = ; s[i]; ++i)
{
if(!trie[now][s[i] - ])
trie[now][s[i] - ] = ++ptot;
now = trie[now][s[i] - ];
}
lst[now] = true;
} void getfail()
{
int now, front = , back = ;
for(int i = ; i < ; ++i)
if(trie[][i]) q[++back] = trie[][i];
while(front != back)
{
now = q[++front];
for(int i = ; i < ; ++i)
if(trie[now][i])
{
fail[trie[now][i]] = trie[fail[now]][i];
q[++back] = trie[now][i];
}
else trie[now][i] = trie[fail[now]][i];
if(lst[fail[now]]) lst[now] = true;
}
} int main()
{
int n, m, ans = , now;
scanf("%d%d", &n, &m);
for(int i = ; i <= n; ++i)
{
scanf("%s", s);
insert();
}
getfail(), f[][] = ;
for(int i = ; i < m; ++i)
for(now = ; now <= ptot; ++now)
{
if(lst[now] || !f[i][now]) continue;
for(int j = ; j < ; ++j)
{
int k = trie[now][j];
(f[i + ][k] += f[i][now]) %= ;
}
}
for(int i = ; i <= m; ++i)
ans = ans * % ;
for(int i = ; i <= ptot; ++i)
if(!lst[i]) ans = (ans + - f[m][i]) % ;
printf("%d\n", ans);
return ;
}

[BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)的更多相关文章

  1. [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)

    题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...

  2. BZOJ1030[JSOI2007]文本生成器——AC自动机+DP

    题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...

  3. [Bzoj1030][JSOI2007]文本生成器(AC自动机&dp)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1030 最最最常见的多串匹配问题!题目求至少包含一个子串的方案数,则可以转化成全部方案-不 ...

  4. 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp

    题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...

  5. 【BZOJ-1030】文本生成器 AC自动机 + DP

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

  6. [JSOI2007]文本生成器 --- AC自动机 + DP

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

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

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

  8. 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp

    正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...

  9. [bzoj1030][JSOI2007]文本生成器——AC自动机

    Brief Description 给定一些模式串,您需要求出满足以下要求的字符串的个数. 长度为m 包含任意一个模式串 Algorithm Design 以下内容来自神犇博客 首先运用补集转换,转而 ...

随机推荐

  1. 修改MacBook Pro主机名,共享电脑名

    https://support.apple.com/kb/PH25384?viewlocale=zh_CN&locale=zh_CN http://www.ituring.com.cn/art ...

  2. centos出现“FirewallD is not running”怎么办

    最近在阿里云服务器centos上安装了mysql数据库,默认是不开启远端访问功能,需要设置一下防火墙,在开放默认端口号 3306时提示FirewallD is not running,经过排查发现是防 ...

  3. 01-vagrant安装centos7

    1. 安装VirtualBox 2. 安装Vagrant 3. 下载 centos-7.0-x86_64.box   [安装命令] $ mkdir vagrant $ cd vagrant $ vag ...

  4. 在tableViewCell的点击事件中处理界面跳转问题

    UIViewController *controller; UIView *view = self.view; while (1) { controller = (UIViewController * ...

  5. Inspinia_admin-V2.3原版(英文)

    Inspinia_admin-V2.3原版(英文) Inspinia_admin-V2.3 BootStrap原版(英文) 原版是老外开发的,结果 国内某人翻译成中文版进行二次开发 卖998 演示地址 ...

  6. 编译安装python3.6后pip3无法安装模块问题处理

    编译安装python3.6之后,使用pip3命令安装第三方库效果如图所示: pip is configured with locations that require TLS/SSL, however ...

  7. Java经典编程题50道之三十七

    有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. public class Example37 { public static v ...

  8. Spring_Spring与DAO_Spring的Jdbc模板

    一.导入Jar包 二.定义实体类与DB表 public class Student { private Integer id; private String name; private int age ...

  9. Java.lang.Comparable接口和Java.util.Comparator接口的区别

    Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...

  10. 转载 USB固件分析

    http://1438431234.spaces.eepw.com.cn/articles/article/item/114022 0x00000000 0x0001fff0 大小 0x1fff1 = ...