P2322 [HNOI2006]最短母串问题

AC自动机+bfs

题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点

因为n<12,所以我们可以用二进制保存状态:某个带结尾标记的点是否被处理到。

把编号为 i 的结尾标记设为2^(i-1)

然后跑一遍bfs,如果跑到某个点结尾标记之和=2^n-1,那么就说明答案找到了

开2个数组保存每个bfs状态的对应的上一个编号和对应字母

输出的时候递归即可

attention:保存bfs状态的数组一定要开的很大(2e5/1e6/2e6 70pts/90pts/AC)

对于字典序问题:查找顺序都是'A'->‘Z’,不用担心(我还瞎操心个啥qaq)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct data{
int nxt[],fail,last,end;
}a[];
struct node{int id,t,state;};
char q[];
int n,cnt1,cnt2,pre1[],pre2[];
bool vis[][];
inline void Trie_build(int id){
scanf("%s",q);
int u=,len=strlen(q);
for(int i=;i<len;++i){
int p=q[i]-'A';
if(!a[u].nxt[p]) a[u].nxt[p]=++cnt1;
u=a[u].nxt[p];
}a[u].end|=<<(id-); //标记值=2^(i-1)
}
void AC_build(){
queue <int> h;
for(int i=;i<;++i) if(a[].nxt[i]) h.push(a[].nxt[i]);
while(!h.empty()){
int x=h.front(); h.pop();
for(int i=;i<;++i){
int &to=a[x].nxt[i];
if(to){
a[to].fail=a[a[x].fail].nxt[i];
a[to].last= a[a[to].fail].end ? a[to].fail:a[a[to].fail].last;
a[to].end|=a[a[to].last].end; //累加上所有后缀的状态
h.push(to);
}else to=a[a[x].fail].nxt[i];
}
}
}
inline void print(int x){ //递归输出
if(!x) return;
print(pre1[x]);
putchar(pre2[x]+'A');
}
void bfs(){
queue <node> h;
h.push((node){,,a[].end});
while(!h.empty()){
node x=h.front(); h.pop();
if(x.state==(<<n)-) {print(x.t); return ;}
for(int i=;i<;++i){ //字典序从小到大
node to=(node){a[x.id].nxt[i],,x.state|a[a[x.id].nxt[i]].end}; //状态更新
if(vis[to.state][to.id]) continue; //去重
vis[to.state][to.id]=; to.t=++cnt2; //给一个新编号
pre1[cnt2]=x.t; pre2[cnt2]=i; //用两个数组存该编号对应的字母和上级的编号
h.push(to);
}
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i) Trie_build(i);
AC_build(); bfs();
return ;
}

P2322 [HNOI2006]最短母串问题的更多相关文章

  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. BZOJ 1195: [HNOI2006]最短母串

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

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

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

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

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

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

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

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

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

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

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

  9. bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机

    LINK:最短母串 求母串的问题.不适合SAM. 可以先简化问题 考虑给出的n个字符串不存在包含关系. 那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以 ...

随机推荐

  1. Spring的AOP编程

    1.手动实现AOP编程(代理模式) AOP是面向切面的编程,主要功能就是实现"业务代码"和辅助业务代码的"关注点代码"分离.在一个方法中,出了核心的业务代码,其 ...

  2. 系统之锹sysdig:Linux服务器监控和排障利器

    当你需要追踪某个进程产生和接收的系统调用时,首先浮现在你脑海中的是什么?你可能会想到strace,那么你是对的.你会使用什么样的命令行工具来监控原始网络通信呢?如果你想到了tcpdump,你又作出了一 ...

  3. 可视化url

    http://blog.csdn.net/u011532367/article/list/1

  4. flask_SQLAlchemy常用数据类型及列选项

    SQLAlchemy常用数据类型:1. Integer:整形,映射到数据库中是int类型.2. Float:浮点类型,映射到数据库中是float类型.他占据的32位.3. Double:双精度浮点类型 ...

  5. CSS 3列等高

    方法1: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"&g ...

  6. kernel下nand flash的文件系统总结

    1.FLASH转换层(FTL) EXt2/EXT3/EXT4文件系统可以通过FTL实现对flash的支持,因为FTL可以将闪存flash模拟成磁盘结构. 在ext2文件系统的基础上上,为了保证数据的一 ...

  7. Keras 源码分析

    . │ activations.py │ callbacks.py │ constraints.py │ initializations.py │ metrics.py │ models.py │ o ...

  8. eigen quick reference

    参考: http://eigen.tuxfamily.org/dox/AsciiQuickReference.txt // A simple quickref for Eigen. Add anyth ...

  9. web api 获取传过来的Json

    public async void PostOrder(HttpRequestMessage request) { String responseBodyAsText = await request. ...

  10. js实现轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...