原题

给出n个字符串,求随机生成一个m长度的字符串,有多少个是可辨识的(即出现了n个字符串中的任意字符串)


正难则反

求有多少个不可辨识的,26^m-不可辨识即为答案

f[i][j]表示填到第i个字符,在自动机上第j个节点时的答案

状态转移方程很明显:

f[i][j]+=f[i-1][f[j]]

#include<cstdio>
#include<cstring>
#define p 10007
#define N 6010
using namespace std;
int n,m,sze=1,ans1,ans2=1,a[N][27],fail[N],q[N],f[110][N];
char s[110];
bool is[N]; void ins()
{
int now=1,c,l=strlen(s);
for (int i=0;i<l;i++)
{
c=s[i]-'A'+1;
if (a[now][c]) now=a[now][c];
else now=a[now][c]=++sze;
}
is[now]=1;
} void acmatch()
{
int l=0,r=1,now;
q[0]=1;fail[1]=0;
while (l<r)
{
now=q[l++];
for (int i=1;i<=26;i++)
{
if (!a[now][i]) continue;//如果没有这条边
int k=fail[now];
while (!a[k][i]) k=fail[k];//找到第一个有该边的该节点的后缀节点
fail[a[now][i]]=a[k][i];//我儿子的后缀节点等于我的后缀节点的该边
if (is[a[k][i]])//传递结尾标记
is[a[now][i]]=1;
q[r++]=a[now][i];
}
}
} void dp(int x)
{
for(int i=1;i<=sze;i++)
{
if (is[i] || !f[x-1][i]) continue;//如果这个节点是结尾(不能出现结尾)或者到前一位就已经不能在这个节点了
for (int j=1;j<=26;j++)//枚举下一位
{
int k=i;
while (!a[k][j]) k=fail[k];//找到后缀节点
f[x][a[k][j]]=(f[x][a[k][j]]+f[x-1][i])%p;//更新答案
}
}
} int main()
{
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);
ins();
}
acmatch();
f[0][1]=1;
for (int i=1;i<=m;i++) dp(i);//f[i][j]表示考虑到第x位在AC自动机上第j个节点的答案
for (int i=1;i<=m;i++)
ans2=ans2*26%p;//26^m为总字符串数
for (int i=1;i<=sze;i++)
if (!is[i]) ans1=(ans1+f[m][i])%p;//ans2为不能认出来的字符串数
printf("%d",(ans2-ans1+p)%p);
return 0;
}

[bzoj] 1030 文本生成器 || AC自动机+dp的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 1030: [JSOI2007]文本生成器 ac自动机+dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...

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

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

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

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

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

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

随机推荐

  1. python generator

    def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] for char in reverse('g ...

  2. 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程

    本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...

  3. 【Extremely Basic Words for Listening】word list

    [Extremely Basic Words for Listening]word list updated continuously recite count: 0 careless exercis ...

  4. lesson 20 pioneer pilots

    lesson 20 Pioneer pilots driver pilot rider cyclist 骑自行车的人 介词后不加that cover + 距离 = travel 了一段距离 by su ...

  5. Spring Cloud(七):配置中心(Git 版与动态刷新)【Finchley 版】

    Spring Cloud(七):配置中心(Git 版与动态刷新)[Finchley 版]  发表于 2018-04-19 |  更新于 2018-04-24 |  Spring Cloud Confi ...

  6. leetcode-最大子序和(动态规划讲解)

    最大子序和(动态规划讲解) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输 ...

  7. 软工2017第四周作业结对编程——个人psp

    29.22 --9.26本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 预计时间 开始时间                结束时间 中断时间 ...

  8. 测试报告M2

    1,项目简介我们已经在第一次测试报告中说过,这一次主要说一下场景测试实例 1.1测试人员 测试人员包括团队开发小组成员以及特邀测试用户组. 1)  团队内部测试主要针对网站支持的各功能组件进行一一测试 ...

  9. c# 删除word文档中某一页

    object objPage = 14; int pages = oDoc.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wd ...

  10. 软件工程课堂作业(三)——Right-BICEP软件单元测试

    一.测试方法:Right-BICEP Right-结果是否正确?B-是否所有的边界条件都是正确的?I-能查一下反向关联吗?C-能用其他手段交叉检查一下结果吗?E-你是否可以强制错误条件发生?P-是否满 ...