[HNOI2006]最短母串问题(AC自动机+状态压缩+bfs)
快要THUSC了,来水几道模板题吧。
这题其实是AC自动机模板。看到长度最短,首先就想到AC自动机。那么就直接暴力法来吧,把每个串建立在AC自动机上,建立fail指针,然后由于n<=12,可以把记录的状态压缩一下,就是压缩走到该节点出现了哪些状态,建立fail指针时也顺带更新一下。然后直接从根节点开始bfs,即可求出状态,复杂度O(26*2^n*Σ|S|),注意内存是32MB,而我使用的空间复杂度是O(2^n*Σ|S|),而开数组要开3个这么大的数组,这样通过计算需要34MB,所以将其中一个数组(vis数组)开成bool才能通过。
#include<bits/stdc++.h>
using namespace std;
const int N=,M=;
int n,cnt,tot,num,tim,ch[N][],fail[N],st[N],a[N],ans[N*M],fa[N*M];
bool vis[N][M];
char str[N];
void build()
{
queue<int>q;
for(int i=;i<;i++)if(ch[][i])q.push(ch[][i]);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=;i<;i++)
if(ch[u][i])
{
fail[ch[u][i]]=ch[fail[u]][i];
st[ch[u][i]]|=st[ch[fail[u]][i]];
q.push(ch[u][i]);
}
else ch[u][i]=ch[fail[u]][i];
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i)
{
scanf("%s",str);
int u=,len=strlen(str);
for(int j=;j<len;j++)
{
if(!ch[u][str[j]-'A'])ch[u][str[j]-'A']=++cnt;
u=ch[u][str[j]-'A'];
}
st[u]|=<<i-;
}
build();
queue<int>q1,q2;
q1.push(),q2.push();
while(!q1.empty())
{
int u=q1.front(),S=q2.front();
q1.pop(),q2.pop();
if(S==(<<n)-)
{
while(tim)a[++num]=ans[tim],tim=fa[tim];
for(int i=num;i;i--)printf("%c",a[i]+'A');
return ;
}
for(int i=;i<;i++)
if(!vis[ch[u][i]][S|st[ch[u][i]]])
{
vis[ch[u][i]][S|st[ch[u][i]]]=;
q1.push(ch[u][i]),q2.push(S|st[ch[u][i]]);
fa[++tot]=tim,ans[tot]=i;
}
tim++;
}
}
[HNOI2006]最短母串问题(AC自动机+状态压缩+bfs)的更多相关文章
- [HNOI2006]最短母串问题——AC自动机+状压+bfs环形处理
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 32MB Input 第一行是一个正整数n(n< ...
- [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索
[HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...
- [HNOI2006]最短母串问题 AC自动机
题面:洛谷 题解: 如果我们对这些小串建出AC自动机,那么我们所求的大串就是要求满足遍历过所有AC自动机上的叶子节点,且经过步数最少的串.如果有多个步数相同的串,要输出字典序最小的串. 在AC自动机上 ...
- [BZOJ1195]:[HNOI2006]最短母串(AC自动机+BFS)
题目传送门 题目描述 给定n个字符串(S1,S2,…,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,…,Sn)都是T的子串. 输入格式 第一行是一个正整数n,表示给定的字符串的个数 ...
- 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...
- P2322 [HNOI2006]最短母串问题
P2322 [HNOI2006]最短母串问题 AC自动机+bfs 题目要求:在AC自动机建的Trie图上找到一条最短链,包含所有带结尾标记的点 因为n<12,所以我们可以用二进制保存状态:某个带 ...
- 【状态压缩dp】1195: [HNOI2006]最短母串
一个清晰的思路就是状压dp:不过也有AC自动机+BFS的做法 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T ...
- BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图
BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2, ...
- 2782: [HNOI2006]最短母串
2782: [HNOI2006]最短母串 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 2[Submit][Status][Web ...
随机推荐
- 文献阅读 - MonoLoco与关于Camera Matrix的笔记
目录 概览 HighLights Camera Intrinsic Matrix 笔记 Intrinsic Matrix Task-Error - 不确定性任务下确界的计算 输出假设的Laplace分 ...
- 【每日Scrum】第十天冲刺
一.计划会议内容 尝试整合代码 二.任务看板 任务看板 已完成:登录与个人界面布局实现,UI设计美化,地图主界面 进行中:功能整合, 待进行:连接数据库 三.scrum讨论照片 四.产品的状态 无 五 ...
- UVA 10003 区间DP
这个题目蛮有新意的,一度导致我没看透他是区间DP 给一个0-L长度的木板,然后给N个数,表示0-L之间的某个刻度,最后要用刀把每个刻度都切一下 使其断开,然后每次分裂的cost是分裂前的木板的长度.求 ...
- 卷积神经网络应用于tensorflow手写数字识别(第三版)
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_dat ...
- spring boot 接口返回值封装
Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...
- iOS如何禁用长按页面弹出菜单
iOS如何禁止用户长按页面导致弹出菜单? 给元素设置样式: -webkit-touch-callout:none; 补充:同样适用于图片如果想禁止用户保存或者复制等
- POJ 3258:River Hopscotch 二分的好想法
River Hopscotch Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9326 Accepted: 4016 D ...
- HTML5新标签使用及CSS选择器(伪类)
这些标签能够让搜索引擎更直接的解析页面内容. <header></header>语义:文档或者页面的头部 <nav></nav>语义:导航这两者不是组合 ...
- 题解 P4781 【【模板】拉格朗日插值】
题目 本蒟蒻看到一道数学题,就顺手切了.感觉单单对这一题而言,部分评论区的大佬过于复杂了 [分析] 先讲讲拉格朗日插值法: 对于给定的 \((n+1)\) 个点,我们可以确定唯一的一个 至多\(n\) ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习:prototype(原型对象)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...