题目大意:给你一堆字符串,一个串不合法的条件是这些字符串中任意一个是这个串的子串,求合法的串的数量

其实这道题比 [HNOI2008]GT考试 那道题好写一些,但道理是一样的

只不过这道题的答案可以转化为 所有可能的字符串(26^m)数量 - 不合法的字符串数量

定义f[i][j]表示匹配到了第i个字符,现在在Trie树上匹配到了第j个节点的方案数

GT考试是跳Next,每次找出 和 插入这个字符后形成的字符串 具有相同最长后缀的位置

那么对于Trie图来说,这不就是fail指针么

Trie树被补全成Trie树后

如果在原来的Trie树中某个节点x,它并没有儿子ch[x][c],那么在补全后,ch[x][c]自动指向的是x的fail指针指向的c儿子,即ch[fail[x]][c]

这不正是我们想要转移的位置么,非常智能

总结:字符串套KMP/AC自动机/Trie图的题,通常都有f[i][j]表示文本串匹配到了第i位,模式串匹配到了第j位这类状态,且有一些题可以用矩阵乘法优化。

 #include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define N 6010
#define M 28
#define mod 10007
#define ui unsigned int
#define idx(x) (x-'A'+1)
#define inf 0x3f3f3f3f
using namespace std;
//re
int n,m;
char str[][];
int f[][N];
int qpow(int x,int y){
int ans=;
while(y){
if(y&) ans=(ans*x)%mod;
x=(x*x)%mod,y>>=;
}return ans;
}
struct Trie{
int ch[N][M],fa[N],fail[N],ed[N],tot;
void Build()
{
for(int i=;i<=n;i++)
{
int len=strlen(str[i]+),x=;
for(int j=;j<=len;j++)
{
int c=idx(str[i][j]);
if(!ch[x][c])
tot++,ch[x][c]=tot,fa[tot]=x;
x=ch[x][c];
if(j==len) ed[x]=;
}
}
}
void Fail()
{
queue<int>q;
for(int i=;i<=;i++)
if(ch[][i]) q.push(ch[][i]);
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=;i<=;i++)
if(ch[x][i])
fail[ch[x][i]]=ch[fail[x]][i],
q.push(ch[x][i]);
else
ch[x][i]=ch[fail[x]][i];
}
}
int solve()
{
f[][]=;
queue<int>q;
for(int i=;i<=m;i++)
for(int x=;x<=tot;x++)
for(int c=;c<=;c++)
{
int flag=;
for(int k=ch[x][c];k;k=fail[k])
if(ed[k]){flag=;break;}
if(!flag) continue;
(f[i+][ch[x][c]]+=f[i][x])%=mod;
}
int ans=;
for(int x=;x<=tot;x++)
if(!ed[x]) (ans+=f[m][x])%=mod;
return ans;
}
}t;
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%s",str[i]+);
t.Build();
t.Fail();
printf("%u\n",(qpow(,m)-t.solve()+mod)%mod);
return ;
}

BZOJ 1030 [JSOI2007]文本生成器 (Trie图+DP)的更多相关文章

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

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

  2. bzoj 1030: [JSOI2007]文本生成器 (ac自己主动机上的dp)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2635  Solved: 1090 [id=1030&qu ...

  3. BZOJ 1030 [JSOI2007]文本生成器

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

  4. 【刷题】BZOJ 1030 [JSOI2007]文本生成器

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

  5. bzoj 1030 [JSOI2007]文本生成器(AC自动机+DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题意] 给n个小串,随机构造一个长为m的大串,一个串合法当且仅当包含一个或多个 ...

  6. BZOJ 1030 [JSOI2007]文本生成器(AC自动机)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1030 [题目大意] 求出包含任意一个给定串的串数量 [题解] 我们求出不包含任意一个给 ...

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

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

  8. 1030: [JSOI2007]文本生成器

    1030: [JSOI2007]文本生成器 https://www.lydsy.com/JudgeOnline/problem.php?id=1030 分析: AC自动机+dp. 正难则反,求满足的, ...

  9. BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP

    BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他 ...

随机推荐

  1. JavaScript:进制转换。

    最近做了一些进制的转换的点. 十进制转二进制: let a = 45; a.toString(2); //"101101" let b = 123; b.toString(2); ...

  2. C++ STL-stack使用详解

    stack 类是容器适配器,它给予程序员栈的功能--特别是 FILO (先进后出)数据结构. 该类模板表现为底层容器的包装器--只提供特定函数集合.栈从被称作栈顶的容器尾部推弹元素. 一:头文件 #i ...

  3. 人脸识别中的harr特征提取(转)

    影响AdaBoost人脸检测训练算法速度很重要的两方面是特征选取和特征计算.选取的特征为矩特征为Haar特征,计算的方法为积分图. (1)Haar特征:     Haar特征分为三类:边缘特征.线性特 ...

  4. SpringMVC的DispatcherServlet加载过程

    首先在web.xml中配置容器启动监听器,这样在容器启动后Spring会初始化一个ServletContext,负责加载springmvc的九大组件(调用DispatcherServlet.onRef ...

  5. LiquidCrystal库函数

    主要资料来源: 极客工坊-知识库 (LiquidCrystal库地址:http://wiki.geek-workshop.com/doku.php?id=arduino:libraries:liqui ...

  6. BA-ALC控制模块

  7. [SharePoint2010开发入门经典]一、SPS2010介绍

    本章概要: 1.熟悉SPS基本特性 2.理解SPS基础架构 3.开发SPS工具

  8. openstack通过Network Namespace和iptables实现租户私有网络互訪和L3路由功能

    安装架构介绍 本文旨在通过自己搭建类似neutron (openvswitch + gre) 实现SDN 的环境,学习了解其工作原理,模拟核心原理.比方:同一租户自己定义网络 instance 互通, ...

  9. OJ刷题---手机尾号评分

    题目要求: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dis ...

  10. linux虚拟机网络设置好ping百度没有用

    场景:公司内网,本机使用的是本地连接,不是wiff,虚拟机设置了桥接模式 问题:使用桥接模式 启动好网络服务,查看ifconfig也获取到了设置的ip,可是ping了www.baidu.com还是没有 ...