C++之路进阶——bzoj1030(文本生成器)

C++之路进阶——bzoj1030(文本生成器)
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);
}
上一篇:JS点击子元素不触发父元素点击事件(js阻止冒泡)


下一篇:89C51单片机定时器控制的流水灯