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

其实这道题比 [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. 刷新linux硬盘存储接口

    #!/bin/bash for i in /sys/class/scsi_host/*; do echo "- - -" > $i/scan; done 简写 for i i ...

  2. bilibili用户信息查询

    bilibili用户信息查询 http://space.bilibili.com/ajax/member/GetInfo?mid= 后缀为用户mid号 # -*- coding:utf-8 -*- # ...

  3. windowbuilder01 按钮事件监听

  4. J - Borg Maze

    J - Borg Maze 思路:bfs+最小生成树. #include<queue> #include<cstdio> #include<cstring> #in ...

  5. tableView计算动态行高的总结

    研究tableView怎么计算动态行高研究了两天一直还不太会,今天最终做出来了想要的效果. 首先.我在网上搜集了非常多资料,各种大神的总结,然后開始看.研究.试验,基本思路都是一样的. 1.一定要将l ...

  6. [Tailwind] Style Elements on hover and focus with Tailwind’s State Variants

    In this lesson, we learn how to target specific states of elements and apply styles only when those ...

  7. 远程视频监控之驱动篇(LED)

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38515205 之前一直在考虑该不该写这篇,由于我之前在博客里有写过LED的驱动 ...

  8. Android通过Intent.ACTION_CLOSE_SYSTEM_DIALOGS监听Home按键消息

    Android对屏幕下方经常使用的四个按键消息处理是不一致的: 1.搜索按键的消息在onKeyDown或者onKeyUp中接收: 2.菜单按键的消息在onCreateOptionsMenu.onKey ...

  9. Universal-Image-Loader(UIL)图片载入框架使用简介

    这个也是近期项目中使用到的第三方图片载入框架.在这里也自己总结一下,简单的介绍一些使用的方式. UIL图片载入框架特点 简单介绍: 项目地址:https://github.com/nostra13/A ...

  10. Centos7 minimal 系列之rabbitmq安装(八)

    一.安装Erlang 由于RabbitMQ依赖Erlang, 所以需要先安装Erlang. 这种方法网站访问不了 wget https://packages.erlang-solutions.com/ ...