#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. jquery事件手冊

    方法 描写叙述 bind() 向匹配元素附加一个或很多其它事件处理器 blur() 触发.或将函数绑定到指定元素的 blur 事件 change() 触发.或将函数绑定到指定元素的 change 事件 ...

  2. HDU 6073 Matching In Multiplication dfs遍历环 + 拓扑

    Matching In Multiplication Problem DescriptionIn the mathematical discipline of graph theory, a bipa ...

  3. COGS28 [NOI2006] 最大获利[最大权闭合子图]

    [NOI2006] 最大获利 ★★★☆   输入文件:profit.in   输出文件:profit.out   简单对比时间限制:2 s   内存限制:512 MB [问题描述] 新的技术正冲击着手 ...

  4. java线程阻塞(sleep,suspend,resume,yield,wait,notify)

    为了解决对共享存储区的访问冲突,Java 引入了同步机制,现在让我们来考察多个线程对共享资源的访问,显然同步机制已经不够了,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了 ...

  5. javascript数据基本类型和引用类型

    JavaScript基本数据类型: js基本数据类型包括:undefined,null,number,boolean,string.基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值. ...

  6. css3某些特性

    在下列情况下,建议使用opacity属性而不是rgba()函数 1.实现多种颜色(元素)的半透明效果.使用opacity属性,不仅背景颜色,就连文本颜色.边框颜色都会变透明. 2.在不知道颜色的情况下 ...

  7. Uboot中start.S源码的指令级的详尽解析【转】

    本文转载自:http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/release/html/uboot_starts_analys ...

  8. java 开发面试题小整理(二)

    51.Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口? 答:可以继承其他类或实现其他接口,在Swing编程和Android开发中常用此方式来实现事件监听和 ...

  9. codeforces 696B B. Puzzles(树形dp+概率)

    题目链接: B. Puzzles time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  10. 纯CSS画WP8界面

    我的手机是诺基亚920,13年4月份买的.工作之余,就想用css做一下WP8的界面效果,如上图所示.不做不知道,一做还挺难的.尤其是画那个QQ 的企鹅图标,太难画了.怎么画都不像. <!doct ...