1195: [HNOI2006]最短母串

Time Limit: 10 Sec  Memory Limit: 32 MB

Description

给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串。

Input

第一行是一个正整数n(n<=12),表示给定的字符串的个数。以下的n行,每行有一个全由大写字母组成的字符串。每个字符串的长度不超过50.

Output

只有一行,为找到的最短的字符串T。在保证最短的前提下,如果有多个字符串都满足要求,那么必须输出按字典序排列的第一个。

Sample Input

2
ABCD
BCDABC

Sample Output

ABCDABC
 
题解:
一开始的确想到了状压……但是没有想到后面的操作……
而且这个题让我不得不打数组版……痛心疾首。
如果我们按照AC自动机来做这道题,我们可以这样考虑:
建好trie图之后,从根节点跑一个BFS最短路,并且按照A~Z的顺序往下走,
那么我们就实现了“最短”和“字典序最小”。
而对于字符串,我们可以用状压来记录每个串是否出现。
代码见下:
 #include<cstdio>
#include<cstring>
using namespace std;
const int K=<<;
const int N=;
short n,cnt,bit[];
char s[][],ans[N],c[N*K];
short val[N],ch[N][],f[N];
bool vis[N][K];
int from[N*K],q[N],hd,tl;
short state[N*K],point[N*K];
inline void get_fail()
{
hd=,tl=;
for(int i=;i<;i++)
if(ch[][i])q[tl++]=ch[][i];
while(hd^tl)
{
int rt=q[hd++];
for(int i=;i<;i++)
{
int u=f[rt];
if(ch[rt][i])
{
q[tl++]=ch[rt][i];
while(u&&!ch[u][i])u=f[u];
f[ch[rt][i]]=ch[u][i];
val[ch[rt][i]]|=val[ch[u][i]];
}
else
ch[rt][i]=ch[u][i];
}
}
}
inline void get_ans()
{
hd=,tl=;
while(hd^tl)
{
int u=point[hd],st=state[hd];
if(st==bit[n]-)
{
int id=;
while(hd)ans[++id]=c[hd],hd=from[hd];
while(id>=)putchar(ans[id]),id--;
return;
}
for(int i=;i<;i++)
{
if(!vis[ch[u][i]][st|val[ch[u][i]]])
{
point[tl]=ch[u][i];
c[tl]=i+'A',from[tl]=hd;
state[tl]=st|val[ch[u][i]];
vis[point[tl]][state[tl]]=;
tl++;
}
}
hd++;
}
}
int main()
{
scanf("%d",&n);
bit[]=;for(int i=;i<=n;i++)bit[i]=bit[i-]<<;
for(int i=;i<=n;i++)
{
scanf("%s",s[i]);
int rt=;int m=strlen(s[i]);
for(int j=;j<m;j++)
{
int d=s[i][j]-'A';
if(!ch[rt][d])ch[rt][d]=++cnt;
rt=ch[rt][d];
}
val[rt]|=bit[i-];
}
get_fail();get_ans();
}

[BZOJ1195]

[BZOJ1195]最短母串的更多相关文章

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

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

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

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

  3. 【状态压缩dp】1195: [HNOI2006]最短母串

    一个清晰的思路就是状压dp:不过也有AC自动机+BFS的做法 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T ...

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

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

  5. 2782: [HNOI2006]最短母串

    2782: [HNOI2006]最短母串 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3  Solved: 2[Submit][Status][Web ...

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

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

  7. P2322 [HNOI2006]最短母串问题

    P2322 [HNOI2006]最短母串问题 AC自动机+bfs 题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点 因为n<12,所以我们可以用二进制保存状态:某个带 ...

  8. [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索

    [HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...

  9. 【loj10061】最短母串

    #10061. 「一本通 2.4 练习 4」最短母串 内存限制:512 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 1bentong 提交    提交 ...

随机推荐

  1. 「PKUWC2018」Minimax

    题面 题解 强势安利一波巨佬的$blog$ 线段树合并吼题啊 合并的时候要记一下$A$点权值小于$l$的概率和$A$点权值大于$r$的概率,对$B$点同样做 时空复杂度$\text O(nlogw)$ ...

  2. 两个字段联合约束(mysql)

    联合约束:ALTER TABLE `lywl_provider_package` ADD unique(providerId,packCode) 给一个表建唯一约束

  3. CentOS7.2安装mysql-5.7.19多实例

    安装多实例之前首先需要先安装mysql,这里就不介绍如何安装mysql了,参考前面的博客:https://www.cnblogs.com/hei-ma/p/9505509.html 安装多实例之前需要 ...

  4. python-map, reduce, filter, lambda

    目录 lambda表达式 reduce()函数 map()函数 filter()函数 tips:以下使用到的迭代器,可迭代对象,生成器等概念可以参见我的另一篇博客 lambda表达式 主要用于一行写完 ...

  5. v-model 双向数据绑定

    通过v-model指令可以实现双向数据绑定 HTML部分: <div id="app"> <input type="text" v-model ...

  6. HackRF One硬件架构及参数简介

    本文内容.开发板及配件仅限用于学校或科研院所开展科研实验! 淘宝店铺名称:开源SDR实验室 HackRF链接:https://item.taobao.com/item.htm?spm=a1z10.1- ...

  7. No module named MYSQLdb 报错

    问题描述: 报错:ImportError: No module named MySQLdb 对于不同的系统和程序有如下的解决方法: easy_install mysql-python (mix os) ...

  8. Tensorflow - Implement for a Convolutional Neural Network on MNIST.

    Coding according to TensorFlow 官方文档中文版 中文注释源于:tf.truncated_normal与tf.random_normal TF-卷积函数 tf.nn.con ...

  9. sqlserver-查阻塞

    模拟阻塞: 打开两个窗口:     窗口一: BEGIN TRANSACTION--开始事务 --等待1分钟 WAITFOR DELAY '00:1'; 窗口二: 查询阻塞:(当前被阻塞的进程id,不 ...

  10. 7.hdfs工作流程及机制

    1. hdfs基本工作流程 1. hdfs初始化目录结构 hdfs namenode -format 只是初始化了namenode的工作目录 而datanode的工作目录是在datanode启动后自己 ...