[bzoj] 1030 文本生成器 || AC自动机+dp
原题
给出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的更多相关文章
- bzoj1030 文本生成器(AC自动机+dp)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4777 Solved: 1986[Submit][Stat ...
- [JSOI2007]文本生成器 --- AC自动机 + DP
[JSOI2007]文本生成器 题目描述: JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版. 该软件可以随机 ...
- 【bzoj1030】[JSOI2007]文本生成器 AC自动机+dp
题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是生成一篇长度固 ...
- 洛谷P4052 [JSOI2007]文本生成器 AC自动机+dp
正解:AC自动机+dp 解题报告: 传送门! 感觉AC自动机套dp的题还挺套路的,,, 一般就先跑遍AC自动机,然后就用dp dp的状态一般都是f[i][j]:有i个字符,是ac自动机上的第j个节点, ...
- BZOJ 1030: [JSOI2007]文本生成器 [AC自动机 DP]
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3953 Solved: 1614[Submit][Stat ...
- 1030: [JSOI2007]文本生成器 ac自动机+dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1030 求长度为m不包含n个子串的种数, 跑完ac自动机之后没办法跑矩阵快速幂,因为状态数比较大(6 ...
- 【BZOJ-1030】文本生成器 AC自动机 + DP
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3253 Solved: 1330[Submit][Stat ...
- [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 & dp)
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群,他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
随机推荐
- dva框架之redux相关
dva封装了redux,减少很多重复代码比如action reducers 常量等,本文简单介绍dva redux操作流程. 利用官网的一个加减操作小实例来操作: dva所有的redux操作是放在mo ...
- YUM本地源制作与yum网络版仓库
1.修改本机上的YUM源配置文件,将源指向自己 cd /etc/yum.repos.d/ 备份原有的YUM源的配置文件 rename .repo .repo.bak * rename CentOS-M ...
- hdu1051 Wooden Sticks(贪心+排序,逻辑)
Wooden Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- docker官网安装
最近发现一些同学居然不会安装docker,难,不难,只是“网络不好”! 如果是学习的话,目前我发现的比较好的方法还是到清华的开源镜像网站: https://mirror.tuna.tsinghua.e ...
- Mongo DB Java操作
1.首先下载Mongo DB java 驱动 2.操作Mongo 增删改查 package com.sjjy.mongo; import java.util.ArrayList;import java ...
- Python入门(3)
一.列表 列表是用来储存和处理多个数据的数据类型,我们可以像下面这样来创建一个列表: my_list = [1, 2, 3] 列表和数学中的集合很像,但是,列表中的数据是可以重复,并且他们是有序的,列 ...
- Period :KMP
I - Period Problem Description For each prefix of a given string S with N characters (each character ...
- 机器学习-支持向量机SVM
简介: 支持向量机(SVM)是一种二分类的监督学习模型,他的基本模型是定义在特征空间上的间隔最大的线性模型.他与感知机的区别是,感知机只要找到可以将数据正确划分的超平面即可,而SVM需要找到间隔最大的 ...
- CVPR-2018 那些有趣的新想法
Taylor Guo @ Shanghai - 2018.10.18 缘起 还有什么比顶级会议更适合寻找有趣新想法的地方吗?我们从CVPR 2018 计算机视觉和模式识别的顶级会议中发现了很多有趣的东 ...
- 统计学习三:2.K近邻法代码实现(以最近邻法为例)
通过上文可知k近邻算法的基本原理,以及算法的具体流程,kd树的生成和搜索算法原理.本文实现了kd树的生成和搜索算法,通过对算法的具体实现,我们可以对算法原理有进一步的了解.具体代码可以在我的githu ...