思路比较直接.

由于 $n$ 很小,直接定义 $f[i][j]$ 表示当前在自动机中的节点 $i,$ 被覆盖串的集合为 $j$ 的方案数.

#include <bits/stdc++.h>
#define N 750
#define M 150000
#define setIO(s) freopen(s".in","r",stdin) , freopen(s".out","w",stdout)
using namespace std;
int n,tot,edges,kk;
int Log[30],hd[N],to[N],nex[N],mark[N][5000],fa[M*10],C[M*10];
char str[N];
queue<int>q;
struct Sta
{
int u,sta,id;
Sta(int u=0,int sta=0,int id=0):u(u),sta(sta),id(id){}
};
queue<Sta>Q;
struct Node
{
int sta,f,tag,ch[27];
}t[N];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void insert(int xx)
{
int p=0,i,j,len=strlen(str+1);
for(i=1;i<=len;++i)
{
int c=str[i]-'A';
if(!t[p].ch[c]) t[p].ch[c]=++tot;
p=t[p].ch[c];
}
t[p].tag=1;
t[p].sta|=Log[xx];
}
void build()
{
int i,j;
for(i=0;i<27;++i) if(t[0].ch[i]) q.push(t[0].ch[i]),add(0,t[0].ch[i]);
for(;!q.empty();)
{
int u=q.front();q.pop();
for(i=0;i<27;++i)
{
int qq=t[u].ch[i];
if(!qq)
{
t[u].ch[i]=t[t[u].f].ch[i];
continue;
}
t[qq].f=t[t[u].f].ch[i];
add(t[qq].f,qq);
q.push(qq);
}
}
}
// 继承自己.
void dfs(int x)
{
for(int i=hd[x];i;i=nex[i])
{
int v=to[i];
t[v].sta|=t[x].sta;
dfs(v);
}
}
void print(int c)
{
if(C[c]==-1) return;
print(fa[c]);
printf("%c",C[c]+'A');
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=14;++i) Log[i]=(1<<(i-1));
for(i=1;i<=n;++i) scanf("%s",str+1),insert(i);
build(),dfs(0),C[0]=-1;
for(Q.push(Sta(0,0,kk)),mark[0][0]=1;!Q.empty();)
{
Sta e=Q.front(); Q.pop();
if(e.sta==Log[n+1]-1)
{
print(e.id);
return 0;
}
int v;
int u=e.u;
int idx=e.id;
int sta=e.sta;
for(i=0;i<27;++i)
{
v=t[u].ch[i];
if(!v) continue;
if(mark[v][sta|t[v].sta])
{
continue;
}
++kk;
fa[kk]=idx;
C[kk]=i;
mark[v][sta|t[v].sta]=1;
Q.push(Sta(v,(sta|t[v].sta),kk));
}
}
return 0;
}

  

BZOJ 1195: [HNOI2006]最短母串 AC自动机+状压+搜索的更多相关文章

  1. [HNOI2006]最短母串 (AC自动机+状压)

    Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...

  2. bzoj1195 [HNOI2006]最短母串 AC 自动机+状压+bfs

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1195 题解 建立 AC 自动机,然后构建出 trie 图. 然后直接在 trie 图上走.但是 ...

  3. BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)

    BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...

  4. bzoj 1195: [HNOI2006]最短母串 爆搜

    1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 894  Solved: 288[Submit][Status] ...

  5. BZOJ 1195: [HNOI2006]最短母串

    1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1346  Solved: 450[Submit][Status ...

  6. bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机

    LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...

  7. BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩

    题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的 ...

  8. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

  9. BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...

随机推荐

  1. Android试题

    1. Binder:例子: https://blog.csdn.net/qq_33208587/article/details/82767720

  2. 怎么保证 redis 和 db 中的数据一致

    你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 首先需要考虑到:更新数据库或者更新缓存都有可能失败,在这种前提下分析业务带来的 ...

  3. MyBatis 示例-动态 SQL

    MyBatis 的动态 SQL 包括以下几种元素: 详细的使用参考官网文档:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html 本章内容简单描述这 ...

  4. Unsupported major.minor version 52.0错误和 jdbc odbc

    什么是JDBC? JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库.JDBC也是jav ...

  5. asp.net core 中hangfire面板的配置及使用

    1.定义校验授权类DyDashboardAuthorizationFilter /// <summary> /// Hangfire仪表盘配置授权 /// </summary> ...

  6. 二、LinkList及其源码解析

    1.链表介绍 链表是一种物理单元上非连续,非顺序的存储结构.链表由一系列的姐点组成,结点可以在运行时动态生成.每个结点包含两个部分,一个是存储数据元素的数据域,一个是存储下一个结点的指针域 双链表是链 ...

  7. 行级安全(Row

    通过授予和拒绝(Grant/Deny)命令控制用户的权限,只能控制用户对数据库对象的访问权限,这意味着,用户访问的粒度是对象整体,可以是一个数据表,或视图等,用户要么能够访问数据库对象,要么没有权限访 ...

  8. ulimit 命令详解 socket查看linux最大文件打开数

    ulimit 命令详解     Linux对于每个用户,系统限制其最大进程数.为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数 可以用ulimit -a 来显示当前的各种用户进程限 ...

  9. JavaSpring【七、AspectJ】

    AspectJ 概念 @AspectJ类似纯Java注解的普通Java类 Spring可以使用AspectJ来作为切入点 AOP在运行时仍是纯SpringAOP,对AspectJ无依赖 配置: 对@A ...

  10. Win10系统升级更新方式将会更智能

    使用Win10系统的你肯定遇到过在工作时开始自动更新而不得不搁置工作的情况,想必你也已经被Win10系统的自动更新折磨不已,不过这种情况将会马上得到改观. 微软现在已经开始寻找更智能的版本升级更新方式 ...