原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html


题目描述

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

输入

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

输出

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

样例输入

2
ABCD
BCDABC

样例输出

ABCDABC


题解

AC自动机+BFS

先求出fail数组和Trie图,同时标记每个位置是哪些字符串的结尾,用二进制储存。

要求包含所有串的最小长度,需要记录当前包含哪些串,需要状压。

当到达字符串结尾时,更改状态。

所以Trie图可以看成一个分层图,所求为0,1到(1<<n)-1,i的最短路。

由于每条路径代表一个字符,所以边权为1,可以使用BFS求最短路得解。

#include <cstdio>
#include <cstring>
char str[60] , ch[610] , ans[610];
int tot = 1 , next[610][26] , fail[610] , val[610] , qx[1500010] , qy[1500010] , l , r , dis[610][4096] , fromp[610][4096];
void build()
{int x , i;for(i = 0 ; i < 26 ; i ++ ) next[0][i] = 1;l = r = 1 , qx[1] = 1;while(l <= r){x = qx[l ++ ];for(i = 0 ; i < 26 ; i ++ ){if(next[x][i])fail[next[x][i]] = next[fail[x]][i] , val[next[x][i]] |= val[fail[next[x][i]]] , qx[++r] = next[x][i];else next[x][i] = next[fail[x]][i];}}
}
int main()
{int n , l , i , j , x , y;scanf("%d" , &n);for(i = 1 ; i <= n ; i ++ ){scanf("%s" , str + 1) , l = strlen(str + 1) , x = 1;for(j = 1 ; j <= l ; j ++ ){if(!next[x][str[j] - 'A']) next[x][str[j] - 'A'] = ++tot;x = next[x][str[j] - 'A'] , ch[x] = str[j];}val[x] |= 1 << (i - 1);}build();memset(dis , -1 , sizeof(dis));l = r = 1 , qx[1] = 1 , qy[1] = 0 , dis[1][0] = 0;while(l <= r){x = qx[l] , y = qy[l];for(i = 0 ; i < 26 ; i ++ ){int tx = next[x][i] , ty = y | val[tx];if(dis[tx][ty] == -1){dis[tx][ty] = dis[x][y] + 1 , fromp[tx][ty] = l;if(ty == (1 << n) - 1){int px = tx , py = ty , tmp;for(i = dis[tx][ty] ; i ; i -- )ans[i] = ch[px] , tmp = fromp[px][py] , px = qx[tmp] , py = qy[tmp];printf("%s\n" , ans + 1);return 0;}qx[++r] = tx , qy[r] = ty;}}l ++ ;}return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/6825226.html

【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路相关推荐

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

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

  2. 2782: [HNOI2006]最短母串

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

  3. [HNOI2006]最短母串问题——AC自动机+状压+bfs环形处理

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

  4. HDU 3341 Lost's revenge(AC自动机+状态压缩DP)

    Description 给出N个优良的基因段,每段长度小于等于10,只含有AGCT四种碱基. 现给一段基因片段S,|S|<=40.对其重排列后,最多能含有多少个优良基因,基因段可以有公共部分 I ...

  5. 洛谷 P-4045 密码(AC自动机+状态压缩+数位DP+乱搞)

    洛谷 P-4045 密码 记AC的第一道黑题! 题意:已知一段密码包含了一些字符串,然后求满足条件的密码有多少个,数量小于42时还得全部输出 思路: 一开始WA了两个点,不知道WA的什么,索性把读入的 ...

  6. 【HDU2825】Wireless Password,AC自动机+状态压缩DP

    传送门 写在前面:依旧有毒的HDU,读题半天看不懂啊,感觉自动机的精通遥遥无期啊! 思路: 题意--给定m个给定的串(可能相同),要求组建一个给定长度为n的新串,要求新串中至少包含k个给定的串(序号重 ...

  7. NEFU704(AC自动机+状态压缩)

    题目:Password Leakage #include <iostream> #include <string.h> #include <stdio.h> #in ...

  8. ZOJ3545——AC自动机+状态dp

    这题目是去年大连regional的题目,当时比赛的时候已经看出是道自动机+dp的题目了,但是无奈当时自己的自动机基础太弱了,被虐了一顿.今天再来做这道题目,感觉还好,思路还是蛮清晰的,但是却看出了长时 ...

  9. LeetCode 1723. 完成所有工作的最短时间(DFS+剪枝 / 状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 DFS 2.2 状态压缩DP 265 / 3871, 前6.85% 前3题题解: LeetCode 5649. 解码异或后的数组(位运算) LeetCode ...

最新文章

  1. 如何学习数据挖掘和数据科学的7个步骤
  2. App 运营的指标具体都有哪些?(二)
  3. centos7 yum安装 c c++ gcc gcc-c++
  4. Split-plot设计 SAS实践
  5. 2015年百度三面试题
  6. 循环神经网络(RNN)相关知识
  7. 琥珀项目:Java的未来揭晓
  8. “睡服”面试官系列第十四篇之数组的扩展(建议收藏学习)
  9. 对未标记为可安全执行的脚本_三、??XSS跨站脚本攻击
  10. 信息学奥赛一本通 2063:【例1.4】牛吃牧草
  11. Ethercat解析(七)之主站框架
  12. easyui datagrid加载本地数据和网络数据
  13. python源码剖析 豆瓣_在数据分析师的分析中豆瓣的书那些值得读
  14. db2查询字段备注_SQL基础7:SQLSERVER、ORACLE、DB2中SQL语句查询表字段名、注释、字段类型...
  15. masm5安装教程_MASM5.0汇编器使用
  16. 原来华为手机语音助手,还有3大隐藏功能,职场人的必备神器
  17. bouncing results问题
  18. android其实很简单 -- roaster 以代码构建代码
  19. 不同速度的蚂蚁跑圈相遇问题
  20. Hive:命令行界面、数据类型、DDL数据定义(数据库及表操作/分区分桶)、DML数据操作(数据导入导出)

热门文章

  1. C++ leetcode 26. 删除排序数组中的重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
  2. CTFshow php特性 web131
  3. 两个坐标系进行了缩放平移后的变换关系
  4. 利用Phtoshop去掉图片中的线性渐变背景
  5. 3.2 matlab用if语句实现选择结构
  6. 注视点估计(二维法)
  7. eclipse java shell 窗体显示 bat运行不显示_java eclipse中如何实现点击主窗口sShell中的按钮打开另外一个子窗口sShell...
  8. 【VS+QT开发】找不到到qhostinfo.h文件
  9. java propertysource_[spring] @PropertySource
  10. 08_传智播客iOS视频教程_Foundation框架