BZOJ 1195: [HNOI2006]最短母串 AC自动机+状压+搜索
思路比较直接.
由于 $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自动机+状压+搜索的更多相关文章
- [HNOI2006]最短母串 (AC自动机+状压)
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...
- bzoj1195 [HNOI2006]最短母串 AC 自动机+状压+bfs
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1195 题解 建立 AC 自动机,然后构建出 trie 图. 然后直接在 trie 图上走.但是 ...
- BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)
BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...
- bzoj 1195: [HNOI2006]最短母串 爆搜
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 894 Solved: 288[Submit][Status] ...
- BZOJ 1195: [HNOI2006]最短母串
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1346 Solved: 450[Submit][Status ...
- bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机
LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...
- BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的 ...
- 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...
- BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...
随机推荐
- spring配置文件和spring mvc配置文件的区别
Question: Are applicationContext.xml and spring-servlet.xml related anyhow in Spring Framework? Will ...
- WPF 位图处理相关类
位图的存储方式 开始之前,先了解下位图的存储方式 位图的像素都分配有特定的位置和颜色值.每个像素的颜色信息由RGB组合或者灰度值表示,根据位深度,可将位图分为1.4.8.16.24及32位图像等.每个 ...
- Python 面向对象编程详解
Python 的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承.Py ...
- 作业1:java虚拟机内存模型图示
看了很多篇文章,整理成一幅图,但仍然有许多不解的地方,以后再接着完善,哪位大神看到不正确的地方,请指出,谢谢.
- 微信公众号支付备忘及填坑之路-java
一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...
- luogu P3750 [六省联考2017]分手是祝愿
luogu loj 可以发现在最优策略中,每种操作最多只会做一次,并且操作的先后顺序并不会影响答案,所以考虑从后往前扫,碰到一个\(1\)就对这个位置\(i\)进行操作,这样的操作一定是最优策略.记最 ...
- 15 Django之Celery发送邮件
异步任务--celery发送邮件 安装两个python包: pip install celery==3.1.25 pip install django-celery==3.2.1 pip instal ...
- element消息提示封装
官方的 <template> <el-button :plain="true" @click="open2">成功</el-but ...
- 分布式全局ID的几种生成方案
前言 在互联网的业务系统中,涉及到各种各样的ID,如在支付系统中就会有支付ID.退款ID等. 那一般生成ID都有哪些解决方案呢?特别是在复杂的分布式系统业务场景中,我们应该采用哪种适合自己的解决方案是 ...
- Shell中比较判断
一.shell判断数组中是否包含某个元素:ary=(1 2 3)a=2if [[ "${ary[@]}" =~ "$a" ]] ; then echo & ...