#10061. 「一本通 2.4 练习 4」最短母串

内存限制:512 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: 1bentong
提交    提交记录    统计    讨论    测试数据
 

题目描述

原题来自:HNOI 2006

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

输入格式

第一行是一个正整数 n,表示给定的字符串的个数;

以下的 n 行,每行有一个全由大写字母组成的字符串。

输出格式

只有一行,为找到的最短的字符串 T。

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

样例

样例输入

2
ABCD
BCDABC

样例输出

ABCDABC

数据范围与提示

对于全部数据,1≤n≤12,1≤∣Si∣≤50。

题意:(挂loj是因为我的解法在bzoj上T了并且我不想调QAQ)

给你$n$个字符串,求他们的最短母串,即求一个最短字符串使得这$n$个字符串都是它的子串。若长度相同输出字典序最小的。

题解:

建出$AC$自动机后问题转化成找一条最短的路径覆盖所有$end$节点。

那么我们可以考虑对每个节点维护一个压缩状态表示从根走到该点包含了哪些字符串。

然后从根开始沿$bfs$序遍历(保证字典序最小)并记录路径,若合法则输出答案。

这题主要是教会了我一个真理:

当你发现某个代码已经改不出来的时候,重构代码总是会给你惊喜……

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue> using namespace std;
#define MAXN 15
#define MAXM 605
#define ll long long struct node{
int son[],s;
}tree[MAXM];
struct way{
int las; char ch;
}p[MAXM*(<<MAXN)];
int tot=,nxt[MAXM];
bool vis[MAXM][<<MAXN];
char str[MAXN],ans[MAXN];
inline int read(){
int x=,f=;
char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-')
f=-;
for(;isdigit(c);c=getchar())
x=x*+c-'';
return x*f;
} inline void add(int p,char *str){
int N=strlen(str),u=;
for(int i=;i<N;i++){
int ch=str[i]-'A';
if(!tree[u].son[ch])
tree[u].son[ch]=++tot;
u=tree[u].son[ch];
}
tree[u].s|=(<<p);
return;
} inline void get_nxt(){
for(int i=;i<;i++)
tree[].son[i]=;
queue<int> q; q.push();
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=;i<;i++){
if(tree[u].son[i]){
q.push(tree[u].son[i]);
nxt[tree[u].son[i]]=tree[nxt[u]].son[i];
tree[tree[u].son[i]].s|=tree[tree[nxt[u]].son[i]].s;
}
else tree[u].son[i]=tree[nxt[u]].son[i];
}
}
return;
} inline void solve(int N){
int end=(<<N)-;
queue<int> q1,q2;
q1.push(); q2.push();
int hd=,tl=;
while(!q1.empty() && !q2.empty()){
int u=q1.front();q1.pop();
int sta=q2.front();q2.pop();
if(sta==end){
int cnt=;
for(;hd>;hd=p[hd].las)
ans[++cnt]=p[hd].ch;
for(int i=cnt;i>=;i--)
printf("%c",ans[i]);
printf("\n");
return;
}
for(int i=;i<;i++){
if(!vis[tree[u].son[i]][(tree[tree[u].son[i]].s)|(sta)]){
vis[tree[u].son[i]][(tree[tree[u].son[i]].s)|(sta)]=;
q1.push(tree[u].son[i]);
q2.push((tree[tree[u].son[i]].s)|(sta));
p[++tl].las=hd,p[tl].ch=i+'A';
}
}
hd++;
}
return;
} int main(){
int N=read();
for(int i=;i<N;i++)
scanf("%s",str),add(i,str);
get_nxt(); solve(N);
return ;
}

【loj10061】最短母串的更多相关文章

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

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

  2. 2782: [HNOI2006]最短母串

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

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

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

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

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

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

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

  6. [BZOJ1195]最短母串

    1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MB Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最 ...

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

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

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

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

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

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

随机推荐

  1. Filter注入对象

    由于没有在web.xml文件中加上<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter ...

  2. appium-java-api

    AppiumDriver getAppStrings() 默认系统语言对应的Strings.xml文件内的数据. driver.getAppStrings(String language) 查找某一个 ...

  3. js之substr和substring的差别

    今天有人在群里问这两个的差别,借这个机会在这罗列下 substring(from,to) 開始和结束的位置,从零開始的索引 參数     描写叙述 from     必需. 一个非负的整数,规定要提取 ...

  4. python第三方库系列之十八--python/django test库

    django是属于python语音的web框架,要说django測试.也能够先说说python的測试.django能够用python的方式測试,当然,django也基于python封装了一个自己的測试 ...

  5. Entity Framework 6 Code First 实践系列(1):实体类配置-根据依赖配置关系和关联

    EF实体类的配置可以使用数据注释或Fluent API两种方式配置,Fluent API配置的关键在于搞清实体类的依赖关系,按此方法配置,快速高效合理.为了方便理解,我们使用简化的实体A和B以及A.B ...

  6. 每天一个JavaScript实例-apply和call的使用方法

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  7. 白帽子讲web安全读后感

    又是厚厚的一本书,为了不弄虚做假,只得变更计划,这一次调整为读前三章,安全世界观,浏览器安全和xss.其它待用到时再专门深入学习. 吴翰清是本书作者,icon是一个刺字,圈内人称道哥.曾供职于阿里,后 ...

  8. WEBGIS控制图层的显示

    看别人搞的GIS应用,常常有勾选.取消某个图层的操作,然后地图上就有相应的图形显隐,觉得好酷. 咋实现的? 其实说起来好像也不是特别复杂.在WEB端,实现该功能的原理和步骤是: 1.WEB端加载地图服 ...

  9. spring cloud 配置纲要Properties

    名称 默认 描述 encrypt.fail-on-error true 标记说,如果存在加密或解密错误,进程将失败. encrypt.key   对称密钥.作为一个更强大的替代方案,考虑使用密钥库. ...

  10. chan

    第一单元:分型.笔.线段 ?1  分型 一.分型.笔和线段所属范畴 缠师在<教你炒股票72:本ID已有课程的再梳理>中对缠论做过这样的说明“本ID的理论,本质上分两部分,一是形态学,二是动 ...