F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站
Notice:由于本OJ建立在Linux平台下,而许多题的数据在Windows下制作,请注意输入、输出语句及数据类型及范围,避免无谓的RE出现。

1030: [JSOI2007]文本生成器

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 2991  Solved: 1225
[Submit][Status][Discuss]

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

题解:

danger数组去重优化,如单词abs和单词s只需要匹配到s就可以了,不需要再考虑ab了。

dpf[i][j]表示前i个字符中匹配到ac自动机中第j个字符的个数。

f[i][a[k][j]]=f[i-1][j]+f[i][a[k][j]];

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#define mod 10007
using namespace std;
int n,m,sz=,ans1,ans2=;
int a[][],point[],q[],f[][];
char s[];
bool danger[]; void ins()
{
int now=;
for (int i=;i<strlen(s);i++)
{
int t=s[i]-'A'+;
if (a[now][t]) now=a[now][t];
else now=a[now][t]=++sz;
}
danger[now]=;
} void acmach()
{
int w=,t=,now;
q[]=,point[]=;
while (t<w)
{
now=q[t++];
for (int i=;i<=;i++)
{
if (!a[now][i]) continue;
int k=point[now];
while (!a[k][i])k=point[k];
point[a[now][i]]=a[k][i];
if (danger[a[k][i]]) danger[a[now][i]]=;
q[w++]=a[now][i];
}
}
} void dp(int x)
{
for (int i=;i<=sz;i++)
{
if (danger[i]||!f[x-][i]) continue;
for (int j=;j<=;j++)
{
int k=i;
while (!a[k][j]) k=point[k];
f[x][a[k][j]]=(f[x][a[k][j]]+f[x-][i])%mod;
}
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=;i++) a[][i]=;
for (int i=;i<=n;i++)
{
scanf("%s",s);
ins();
}
acmach();
f[][]=;
for (int i=;i<=m;i++) dp(i);
for (int i=;i<=m;i++)
ans2=ans2*%mod;
for(int i=;i<=sz;i++)
if(!danger[i])ans1=(ans1+f[m][i])%mod;
printf("%d",(ans2-ans1+mod)%mod);
}

C++之路进阶——bzoj1030(文本生成器)的更多相关文章

  1. bzoj1030 文本生成器(AC自动机+dp)

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

  2. BZOJ1030——文本生成器

    给你若干给字符串,再给你一个m,问长度是m的字符串中包含给定字符串的数量mod 10007是多少 这个拿过来啥思路也没有,后来还是看了题解,才知道,原来,原来....那个带fail的Trie还可以搞别 ...

  3. bzoj1030 文本生成器

    题目链接 题意 给出\(n\)个字符串,要构造一个长度为\(m\)的字符串\(S\),使得给出的\(n\)个字符串中至少有一个是\(S\)的子串.问方案数. 思路 \(AC\)自动机+\(DP\) 考 ...

  4. 【BZOJ1030】文本生成器(AC自动机,动态规划)

    [BZOJ1030]文本生成器(AC自动机,动态规划) 题面 BZOJ 题解 超级简单良心送分题 很明显是所有状态-不合法状态 合法状态就是\(26^m\) 不合法状态做一个\(dp\)就好 #inc ...

  5. 【BZOJ1030】[JSOI2007]文本生成器 AC自动机+动态规划

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

  6. BZOJ1030 JSOI2007 文本生成器 【AC自动机】【DP】*

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

  7. 【bzoj1030】: [JSOI2007]文本生成器 字符串-AC自动机-DP

    [bzoj1030]: [JSOI2007]文本生成器 首先把匹配任意一个的个数的问题转化为总个数-没有一个匹配的个数 先构造AC自动机,然后枚举每一位的字母以及在自动机上的位置 f[i][j]为第i ...

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

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

  9. bzoj1030 [JSOI2007]文本生成器

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

随机推荐

  1. 面向对象之virtual

    1.父类声明一个虚方法,子类可以对其进行重写(也可以不重写) 2.虚方法必须有方法体,抽象方法必须没有方法体 3.虚方法可以出现在抽象类中,抽象方法必须出现在抽象类中

  2. Bootstrap 进度条媒体对象和 Well 组件

    一.Well 组件 这个组件可以实现简单的嵌入效果. //嵌入效果 <div class="well"> Bootstrap </div> //有 lg 和 ...

  3. JSON数据转换为字典型

    -(NSDictionary *)parseJSONStringToNSDictionary:(NSString *)JSONString {    NSData *JSONData = [JSONS ...

  4. 读书笔记——《图解TCP/IP》(1/4)

    读书笔记——<图解TCP/IP>(1/4) 经典摘抄 第一章 网络基础知识 1.独立模式:计算机未连接到网络,各自独立使用的方式. 2.广域网 WAN 局域网 LAN 城域网 MAN 3. ...

  5. C++用数组实现的静态队列

    #ifndef _STATIC_QUEUE_H_ #define _STATIC_QUEUE_H_ // 静态queue模板,用数组实现的队列,在初始化的时候需要指定长度 template<cl ...

  6. Java学习-029-JSON 之三 -- 模仿 cssSelector 封装读取 JSON 数据方法

    前文简单介绍了如何通过 json-20141113.jar 提供的功能获取 JSON 的数据,敬请参阅:Java学习-028-JSON 之二 -- 数据读取. 了解学习过 JQuery 的朋友都知道, ...

  7. qt QString 与 int,char的转换

    每次QString转换int或者char的时候都要查资料,记录一下,方便下次查看. 参考: http://blog.csdn.net/ei__nino/article/details/7297791 ...

  8. C# serialport

    最近使用C#写串口的程序,实现串口助手的功能,参考文档记录于此. 参考文档 http://blog.csdn.net/geekwangminli/article/details/7851673 htt ...

  9. 《JAVA NIO》Channel

    3.通道 Channle主要分为两类:File操作对应的FIleChannel和Stream操作对应的socket的3个channe. 1.这3个channel都是抽象类.其具体实现在SPI里面. 2 ...

  10. iostart命令

    Linux系统中的 iostat命令可以对系统的磁盘IO和CPU使用情况进行监控.iostat属于sysstat软件包,可以用yum -y install sysstat 直接安装. 1.基本使用:i ...