欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


传送门 - BZOJ1195


题意概括

  给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的。


题解

  先造一个AC自动机,多模匹配嘛。

  然后bfs在AC自动机上面走,两维状态,dis[i][j]表示已经走到过的串状态为i,在AC自动机上面的位置为j的最短距离。

  然后这题居然要卡空间!

  坑死了。

  然后用了short

  wa掉了。

  发现short实在小的可怜,然后把几个大的数组的有必要的一个开了int,然后30MB卡着限制过去了~

  开心!!


代码

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
struct Trie{
int e,fail,next[];
void init(){
e=fail=;
memset(next,,sizeof next);
}
}tree[];
int cnt;
void AC_Prepare(){
cnt=;
tree[].init(),tree[].init();
for (int i=;i<;i++)
tree[].next[i]=;
}
void add(char ch[],int bh){
int len=strlen(ch),rt=,t;
for (int i=;i<len;i++){
t=ch[i]-'A';
if (!tree[rt].next[t]){
tree[++cnt].init();
tree[rt].next[t]=cnt;
}
rt=tree[rt].next[t];
}
tree[rt].e|=<<bh;
}
void build_AC(){
int q[],head=,tail=,rt,son,k;
tree[].fail=,q[++tail]=;
while (head<tail){
rt=q[++head];
for (int i=;i<;i++){
son=tree[rt].next[i];
if (!son){
tree[rt].next[i]=tree[tree[rt].fail].next[i];
continue;
}
k=tree[rt].fail;
while (!tree[k].next[i])
k=tree[k].fail;
tree[son].fail=tree[k].next[i];
tree[son].e|=tree[tree[k].next[i]].e;
q[++tail]=son;
}
}
}
int n,head,tail,pre[<<][];
short dis[<<][];
bool f[<<][];
char str[],chosen[<<][],ansstr[];
struct Queue{
short x,y;
void push(int a,int b){
x=a,y=b;
}
void pushout(int &a,int &b){
a=x,b=y;
}
}q[];
int main(){
scanf("%d",&n);
AC_Prepare();
for (int i=;i<n;i++){
scanf("%s",str);
add(str,i);
}
build_AC();
memset(f,,sizeof f);
memset(dis,,sizeof dis);
memset(q,,sizeof q);
head=tail=;
q[++tail].push(,);
dis[][]=,f[][]=,pre[][]=;
int ans=-,x,y,x_,y_;
while (head<tail){
q[++head].pushout(x,y);
for (int i=;i<;i++){
y_=tree[y].next[i];
x_=x|tree[y_].e;
if (f[x_][y_])
continue;
dis[x_][y_]=dis[x][y]+;
chosen[x_][y_]=i;
pre[x_][y_]=head;
f[x_][y_]=;
q[++tail].push(x_,y_);
if (x_==(<<n)-){
ans=tail;
break;
}
}
if (ans!=-)
break;
}
q[ans].pushout(x,y);
int ansdis=dis[x][y],xnow,ynow;
for (int j=ansdis,i=ans;j>=&&i;j--,i=pre[xnow][ynow]){
q[i].pushout(xnow,ynow);
ansstr[j]=chosen[xnow][ynow]+'A';
}
for (int i=;i<=ansdis;i++)
printf("%c",ansstr[i]);
return ;
}

BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs的更多相关文章

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

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

  2. Bzoj1195 [HNOI2006]最短母串 [AC自动机]

    Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1304  Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...

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

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

  4. BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图

    BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2, ...

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

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

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

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

  7. BZOJ 1195: [HNOI2006]最短母串 AC自动机+状压+搜索

    思路比较直接. 由于 $n$ 很小,直接定义 $f[i][j]$ 表示当前在自动机中的节点 $i,$ 被覆盖串的集合为 $j$ 的方案数. #include <bits/stdc++.h> ...

  8. [bzoj1195][HNOI2006]最短母串_动态规划_状压dp

    最短母串 bzoj-1195 HNOI-2006 题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串. 注释:$1\le n\le 12$,$1\le ...

  9. Bzoj1195 [HNOI2006]最短母串 [状态压缩]

    Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1304  Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...

随机推荐

  1. 基于Selenium的Web自动化框架增强篇

    在写完上一篇“基于Selenium的Web自动化框架”(http://www.cnblogs.com/AlwinXu/p/5836709.html)之后一直没有时间重新审视该框架,正好趁着给同事分享的 ...

  2. [C++]指针与多级指针(图解)

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 演示: /* @author:John ...

  3. 设置PHPStorm 注释

    /** * Desc: xxx#if (${NAME}) * Class: ${NAME}#end#if (${NAMESPACE}) * Package: ${NAMESPACE}#end * Us ...

  4. Struts局部异常与全局异常处理

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAowAAAG3CAIAAACxBJNyAAAgAElEQVR4nOy9z6tk15Ymdv4B0eRU8O

  5. SpringBoot PUT请求

    (1)配置HiddenHttpMethodFilter(SpringMVC需要配置,SpringBoot已经为我们自动配置了) (2)在视图页面创建一个Post Form表单,在表单中创建一个inpu ...

  6. Python模块学习 - fnmatch & glob

    介绍 fnmatch 和 glob 模块都是用来做字符串匹配文件名的标准库. fnmatch模块 大部分情况下使用字符串匹配查找特定的文件就能满足需求,如果需要更加灵活的字符串匹配,就没有办法了,这里 ...

  7. [转] bss段、data段、text段

    1.前言 一个程序本质上都是由 BSS 段.DATA段.TEXT段三个组成的. 本文主要分编译时和运行时分别对 对data段 bss段 text段 堆 栈作一简要说明 2. 程序编译时概念说明 程序与 ...

  8. Linux的capability深入分析(1)【转】

    转自:https://blog.csdn.net/wangpengqi/article/details/9821227 一)概述: )从2.1版开始,Linux内核有了能力(capability)的概 ...

  9. uoj#188. 【UR #13】Sanrd(Min_25筛)

    题面 传送门 题解 这是一道语文题 不难看出,题目所求即为\(l\)到\(r\)中每个数的次大质因子 我们考虑\(Min\_25\)筛的过程,设 \[S(n,j)=\sum_{i=1}^nsec_p( ...

  10. centos6.5环境下svn服务器和客户端配置实用详解

    一.服务器端配置 安装 # yum install -y subversion yum安装软件,不清除软件包的方法 # vim /etc/yum.conf keepcache=0 建立svn版本库数据 ...