[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版.该软件可以随机生成一些文章―――总是 ...
随机推荐
- python generator
def reverse(data): for index in range(len(data)-1, -1, -1): yield data[index] for char in reverse('g ...
- 游戏人工智能 读书笔记 (四) AI算法简介——Ad-Hoc 行为编程
本文内容包含以下章节: Chapter 2 AI Methods Chapter 2.1 General Notes 本书英文版: Artificial Intelligence and Games ...
- 【Extremely Basic Words for Listening】word list
[Extremely Basic Words for Listening]word list updated continuously recite count: 0 careless exercis ...
- lesson 20 pioneer pilots
lesson 20 Pioneer pilots driver pilot rider cyclist 骑自行车的人 介词后不加that cover + 距离 = travel 了一段距离 by su ...
- Spring Cloud(七):配置中心(Git 版与动态刷新)【Finchley 版】
Spring Cloud(七):配置中心(Git 版与动态刷新)[Finchley 版] 发表于 2018-04-19 | 更新于 2018-04-24 | Spring Cloud Confi ...
- leetcode-最大子序和(动态规划讲解)
最大子序和(动态规划讲解) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输 ...
- 软工2017第四周作业结对编程——个人psp
29.22 --9.26本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 预计时间 开始时间 结束时间 中断时间 ...
- 测试报告M2
1,项目简介我们已经在第一次测试报告中说过,这一次主要说一下场景测试实例 1.1测试人员 测试人员包括团队开发小组成员以及特邀测试用户组. 1) 团队内部测试主要针对网站支持的各功能组件进行一一测试 ...
- c# 删除word文档中某一页
object objPage = 14; int pages = oDoc.ComputeStatistics(Microsoft.Office.Interop.Word.WdStatistic.wd ...
- 软件工程课堂作业(三)——Right-BICEP软件单元测试
一.测试方法:Right-BICEP Right-结果是否正确?B-是否所有的边界条件都是正确的?I-能查一下反向关联吗?C-能用其他手段交叉检查一下结果吗?E-你是否可以强制错误条件发生?P-是否满 ...