【题目大意】

给出单词总数和固定的文章长度M,求出至少包含其中一个单词的可能文章数量。

【思路】

对于至少包含一个的类型,我们可以考虑补集。也就是等于[总的文章可能性总数-不包含任意一个单词的文章总数]有两个注意点:

1.Trie图+DP。Trie图和AC自动机的区别在于,当孩子i为NULL时,则让孩子指针等于fail指针的孩子i,这样就可以继续匹配下去了。因此寻找fail指针的时候,可以不用循环而用判断语句即可。

2.danger表示当前位置包含了单词,所以DP的时候舍去。如果你指向的fail指针是danger的,也就是你的后缀是danger的,那么当前的也是danger的。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAXN=+;
const int MAXM=+;
const int MOD=;
const int NUMA=;
int n,m,cnt=;
struct ACauto
{
int id;
int danger;
ACauto* next[NUMA];
ACauto* fail;
ACauto()
{
danger=;
id=++cnt;
for (int i=;i<NUMA;i++) next[i]=NULL;
fail=NULL;
}
};
ACauto* node[MAXN*MAXM];
int f[MAXN][MAXM*MAXN]; void insert(ACauto* root,char* str)
{
int len=strlen(str);
ACauto* tmp=root; for (int i=;i<len;i++)
{
int index=str[i]-'A';
if (tmp->next[index]==NULL)
{
tmp->next[index]=new ACauto;
node[cnt]=tmp->next[index];
}
tmp=tmp->next[index];
}
tmp->danger=;
} void build(ACauto* root)
{
queue<ACauto*> que;
que.push(root);
while (!que.empty())
{
ACauto* head=que.front();que.pop();
for (int i=;i<NUMA;i++)
{
if (head->next[i]==NULL)
{
if (head==root) head->next[i]=root;
else head->next[i]=head->fail->next[i];
}
else
{
if (head==root) head->next[i]->fail=root;
else
{
head->next[i]->fail=head->fail->next[i];
if (head->next[i]->fail->danger) head->next[i]->danger=;/*注意!*/
}
que.push(head->next[i]);
}
}
}
} void dp(ACauto* root)
{
memset(f,,sizeof(f));
f[][]=;
for (int i=;i<=m-;i++)
for (int j=;j<=cnt;j++)
{
if (!node[j]->danger && f[i][j])
{
for (int k=;k<NUMA;k++)//枚举下一个字母
if (!node[j]->next[k]->danger)
f[i+][node[j]->next[k]->id]=(f[i][j]+f[i+][node[j]->next[k]->id])%MOD;
}
}
} void findres()
{
int ans1=,ans2=;
for (int i=;i<=cnt;i++)
if (!node[i]->danger) ans1=(ans1+f[m][i])%MOD;
for (int i=;i<=m;i++) ans2=(ans2*NUMA)%MOD;
cout<<(ans2-ans1+MOD)%MOD<<endl;
} int main()
{
char str[MAXN];
ACauto* root=new ACauto;
node[]=root;
scanf("%d%d",&n,&m);
for (int i=;i<n;i++)
{
scanf("%s",str);
insert(root,str);
} build(root);
dp(root);
findres();
return ;
}

【Trie图+DP】BZOJ1030[JSOI2007]-文本生成器的更多相关文章

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

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

  2. [Bzoj1030][JSOI2007]文本生成器(AC自动机)(dp)

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

  3. bzoj1030 [JSOI2007]文本生成器

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

  4. BZOJ1030: [JSOI2007]文本生成器(Trie图+dp)

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

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

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

  6. BZOJ1030[JSOI2007]文本生成器——AC自动机+DP

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

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

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

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

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5984  Solved: 2523[Submit][Status][Discuss] Descripti ...

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

    我学到现在才是初三学弟的水平..哭 这里相当于求长度为$m$的,字符集$\{A...Z\}$的且不包含任一模式串的文本串个数.这是一个典型的AC自动机匹配计数问题. 设$f_{i,j}$表示在AC自动 ...

随机推荐

  1. Coursera在线学习---第七节.支持向量机(SVM)

    一.代价函数   对比逻辑回归与支持向量机代价函数. cost1(z)=-log(1/(1+e-z)) cost0(z)=-log(1-1/(1+e-z)) 二.支持向量机中求解代价函数中的C值相当于 ...

  2. 《Linux内核原理与设计》第十一周作业 ShellShock攻击实验

    <Linux内核原理与设计>第十一周作业 ShellShock攻击实验 分组: 和20179215袁琳完成实验及博客攥写 实验内容:   Bash中发现了一个严重漏洞shellshock, ...

  3. Django 1.10中文文档-第一个应用Part5-测试

    本教程上接教程Part4. 前面已经建立一个网页投票应用,现在将为它创建一些自动化测试. 自动化测试简介 什么是自动化测试 测试是检查你的代码是否正常运行的行为.测试也分为不同的级别.有些测试可能是用 ...

  4. 简谈const限定符

    const修饰的数据类型是常量类型,常量类型的对象和变量在定义初始化后是不能被更新的.其实只用记住这一个概念,就可以明白const操作对象的方法. 1)定义const常量 最简单的: const in ...

  5. 【转】CVE-2010-4258 漏洞分析

    一. 漏洞简介 CVE-2010-4258这个漏洞很有意思,主要思路是如果通过clone函数去创建进程,并且带有CLONE_CHILD_CLEARTID标志,那么进程在退出的时候,可以造成内核任意地址 ...

  6. 测试mysqldump 压缩率和时间消耗

    测试mysqldump 压缩率和时间消耗 实验总结: 从本次实验数据可以看出,mysqldump通过|gzip参数可以将导出文件压缩53%,同时耗时也普通非压缩模式的2.3倍. 数据库环境: #[ro ...

  7. c json实战引擎四 , 最后❤跳跃

    引言  - 以前那些系列 长活短说, 写的最终 scjson 纯c跨平台引擎, 希望在合适场景中替代老的csjon引擎, 速度更快, 更轻巧. 下面也是算一个系列吧. 从cjson 中得到灵感, 外加 ...

  8. C++ Primer读书笔记

    以前阅读学习C++ Primer时的习题代码(当时代码风格格式比较渣): https://github.com/liyuan989/exercise/tree/master/c%2B%2B%20pri ...

  9. Python数据处理实战

    一.运行环境 1.python版本 2.7.13 博客代码均是这个版本2.系统环境:win7 64位系统 二.需求 对杂乱文本数据进行处理 部分数据截图如下,第一个字段是原字段,后面3个是清洗出的字段 ...

  10. 虚拟机 VMware Workstation12 安装OS X 系统

      Windows下虚拟机安装Mac OS X —– VMware Workstation12安装Mac OS X 10.11 本文即将介绍WIN虚拟MAC的教程.完整详细教程(包含安装中的一些问题) ...