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. Zabbix学习之路(三)之使用SMTP发送邮件报警及定制邮件报警内容

    1.设置邮件报警的思路 (1)设置触发器(Trigger)-->触发后需要执行的动作(Action) 触发器使用逻辑表达式来评估通过 item 获取到得数据是处于哪种状态.在触发器表达式中我们可 ...

  2. spark on yarn 资源调度(cdh为例)

    一.CPU配置: ApplicationMaster 虚拟 CPU内核 yarn.app.mapreduce.am.resource.cpu-vcores ApplicationMaster占用的cp ...

  3. 探寻ASP.NET MVC鲜为人知的奥秘(2):与Entity Framework配合,让异步贯穿始终

    Why 在应用程序,尤其是互联网应用程序中,性能一直是很多大型网站的困扰,由于Web2.0时代的到来,人们更多的把应用程序从C/S结构迁移到B/S结构,这样会带来客户端轻量,部署.试试方便快捷等优势, ...

  4. 八、Django之Models(译)

    模型(Models) 模型是你的数据的唯一的.确定的信息源. 它包含你所储存数据的必要字段和行为. 通常,每个模型对应数据库中唯一的一张表. 基础: 每个模型都是一个Python类,它们都是djang ...

  5. 牛客小白月赛9H论如何出一道水题(两个连续自然数互质)

    题面 记录一下...连续得两个自然数互质,这题再特判一下1的情况 #include<bits/stdc++.h> using namespace std; int main() { lon ...

  6. Phaser3 屏幕适配iPhoneX、iPhoneXs的坑 -- JavaScript Html5 游戏开发

      PhaserJS 坑:在config内不要把 width 设为 window.innnerWidth在config内不要把 width 设为 window.innnerWidth在config内不 ...

  7. 设置PNG图片DPI 信息,保存为PDF(使用Magick),与OpenCV转换

    目录 任务描述 解决方案 Magick++ Talk is cheap, show me the code. 与 Opencv 配合 相关链接 任务描述 我有这样一个需求,读取一张格式为PNG 或者 ...

  8. 《图解 HTTP 》阅读 —— 第二章

    第2章 简单的http协议 http 协议用于客户端和服务器端的通信. 请求访问文本或图像等资源的一端称为客户端,提供资源响应的一端称为服务器端. 请求报文: 响应报文: 为了能够处理大量的事务,ht ...

  9. Linux环境下Java应用性能分析定位-CPU使用篇

    1     CPU热点分析定位背景 CPU资源还是很昂贵的,为了深刻感受到这种昂贵,间下图当前CPU的资源售价: 所以对于程序猿们来说,需要让程序合理高效的使用CPU资源.利用有限的CPU资源来解决完 ...

  10. mac react-native从零开始android真机测试

    1. 安装android相关jdk,(https://blog.csdn.net/vvv_110/article/details/72897142) 2. 手机和mac使用usb连接, 手机开发者设置 ...