bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机
LINK:最短母串
求母串的问题。不适合SAM。
可以先简化问题 考虑给出的n个字符串不存在包含关系。
那么 那么存在的情况 只可能有 两个字符串拼接起来能表示另外一个字符串 或者某个字符串的后缀可以当成别的字符串的前缀使用。
实际情况可能更加复杂。
观察上面的两种情况 容易AC自动机可以解决类似的问题。
在AC自动机上跑 就可以借用别的字符串的后缀当做自己的前缀进行使用了。
考虑建立出AC自动机 我们要求出一条路径 使得AC自动机上所有的终止节点都被经过。
当然也有特殊情况 就是 以终止节点为fail的节点 或者 以这个节点为fail的节点被经过。
考虑如何求出最短的路径。
可以发现这是一个最短路的问题。当做分层图来跑最短路。
对于上述的两种情况 由于是在 AC自动机的trie图上跑 所以可以满足。
考虑字典序 每次选择节点从字典序最小的选即可。
注意要预处理出s[x]数组 表示x这个节点所表示的所有终止节点的集合 注意 fail指针的s可以传递过来。
const int MAXN=610,maxn=1<<12;
int n,cnt,maxx;
char a[13][MAXN],b[MAXN],ans[MAXN];
int s[MAXN],q[1500010],vis[MAXN][maxn],pre[MAXN][maxn],w[1500010];
struct wy{int ch[26];int fail;}t[MAXN];
inline void insert(int x)
{
int len=strlen(a[x]+1);
int p=0;
rep(1,len,i)
{
int w=a[x][i]-'A';
if(!t[p].ch[w])t[p].ch[w]=++cnt;
p=t[p].ch[w];b[p]=a[x][i];
}
s[p]=s[p]|(1<<(x-1));
}
inline void get_fail()
{
int l=0,r=0;
rep(0,25,i)if(t[0].ch[i])q[++r]=t[0].ch[i];
while(++l<=r)
{
int x=q[l];
rep(0,25,i)
{
int tn=t[x].ch[i];
if(tn)fail(tn)=t[fail(x)].ch[i],s[tn]|=s[t[fail(x)].ch[i]],q[++r]=tn;
else t[x].ch[i]=t[fail(x)].ch[i];
}
}
}
inline void bfs()
{
int l=0,r=0;q[++r]=0;
vis[0][0]=0;w[r]=0;
while(++l<=r)
{
int x=q[l];
int xx=w[l];
rep(0,25,i)
{
int tn=t[x].ch[i];
if(tn)
{
int ss=s[tn]|xx;
if(vis[tn][ss]==-1)
{
pre[tn][ss]=l;
vis[tn][ss]=vis[x][xx]+1;
q[++r]=tn;w[r]=ss;
if(ss==maxx)
{
int w1=tn,w2=ss;
while(vis[tn][ss])
{
ans[vis[tn][ss]]=b[w1];
--vis[tn][ss];
int s1=q[pre[w1][w2]];
int s2=w[pre[w1][w2]];
w1=s1;w2=s2;
}
printf("%s",ans+1);
return;
}
}
}
}
}
}
int main()
{
freopen("1.in","r",stdin);
gt(n);maxx=(1<<n)-1;
rep(1,n,i)gc(a[i]),insert(i);
get_fail();
memset(vis,-1,sizeof(vis));
bfs();return 0;
}
bzoj 1195 [HNOI2006]最短母串 bfs 状压 最短路 AC自动机的更多相关文章
- bzoj 1195: [HNOI2006]最短母串【状压dp】
我有病吧--明明直接枚举是否匹配就可以非要写hash,然后果然冲突了(--我个非酋居然还敢用hash 设f[s][i]为已选串状态为s并且最后一个串是i,还有预处理出g[i][j]表示最长有长为g[i ...
- bzoj 1195: [HNOI2006]最短母串 爆搜
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 894 Solved: 288[Submit][Status] ...
- BZOJ 1195: [HNOI2006]最短母串
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1346 Solved: 450[Submit][Status ...
- BZOJ 1195 [HNOI2006]最短母串 (Trie图+状压+bfs最短路)
BZOJ1195 LOJ10061 题目大意:给你$n$个模式串,求一个最短且字典序最小的文本串并输出这个串,$n<=12,len<=50$ 首先对所有模式串构造$Trie$图,$Trie ...
- 【刷题】BZOJ 1195 [HNOI2006]最短母串
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...
- BZOJ1195 HNOI2006最短母串(状压dp)
按照子串出现的先后考虑.令f[i][j]为已经出现的字符串集合为i,最后一个出现的字符串为j时的最短串长,预处理一下任意两个串的最长重叠长度,转移显然.有点麻烦的是字典序,强行增加代码难度. 另一个比 ...
- BZOJ1195 [HNOI2006]最短母串 【状压dp】
题目 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入格式 第一行是一个正整数n(n<=12),表示给定的字符串的 ...
- BZOJ 1195: [HNOI2006]最短母串 AC自动机+状压+搜索
思路比较直接. 由于 $n$ 很小,直接定义 $f[i][j]$ 表示当前在自动机中的节点 $i,$ 被覆盖串的集合为 $j$ 的方案数. #include <bits/stdc++.h> ...
- 【状态压缩dp】1195: [HNOI2006]最短母串
一个清晰的思路就是状压dp:不过也有AC自动机+BFS的做法 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T ...
随机推荐
- 自适应高度输入框(contenteditable/textarea)
一.用div模拟textarea div模拟输入域可以根据输入内容自动伸缩,而input和textarea输入内容较多时,高度固定,内容会显示不全. 1.坑1(IOS端无法输入) 在取消全局默认样 ...
- HDU5961 传递
传递 因为文化课复习实在捉急qwq,题解就一切从简了qwq 简单说一说 上来一看这道题没看出来突破点在哪... 去HDU上看原题,发现原题是带样例的图解的,然鹅还是没找到思路(太菜了吧) 没办法看了一 ...
- POJ 3057 Evacuation 题解
题目 Fires can be disastrous, especially when a fire breaks out in a room that is completely filled wi ...
- Webapi管理和性能测试工具WebBenchmark
WebBenchmark是一款基于开源通讯组件Beetlex扩展的Webapi管理和性能测试工具,在传统工具中一般管理工具缺乏性能压测能力或有性能测试的缺少管理功能:WebBenchmark的设计目标 ...
- day19 生成器+函数递归
目录 一.yield表达式 1 yield表达式基本用法 二.三元表达式 三.生成式 1 列表生成式 2 字典生成式 3 集合生成式 4 生成器表达式 四.函数的递归 1 递归的定义 2 详解递归 前 ...
- java 数据结构(十):Collection子接口:Set接口
1. 存储的数据特点:无序的.不可重复的元素具体的: 以HashSet为例说明:1. 无序性:不等于随机性.存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的.2. 不可重复性 ...
- Quartz.Net系列(十六):通过Plugins模式使用Xml方式配置Job和Trigger和自定义LogPrivider
1.简单介绍 Quarz.Net中采用插件式来实现配置文件配置,通过XMLSchedulingDataProcessor类进行Xml数据处理 默认配置文件命名:quart_jobs.xml publi ...
- PHP提示dyld: Library not loaded问题解决
Mac在命令行执行php命令时,如php -v 有错误提示: dyld: Library not loaded: /usr/local/opt/openssl/lib/libcrypto.1.0..d ...
- 全栈的自我修养: 003Axios 的简单使用
全栈的自我修养: Axios 的简单使用 You should never judge something you don't understand. 你不应该去评判你不了解的事物. 全栈的自我修养: ...
- [C++面向对象]-C++成员函数和非成员函数
大纲: 1.成员函数和非成员函数 2.详细解释 3.总结 4.参考 1.成员函数和非成员函数 其实简单来说成员函数是在类中定义的函数,而非成员函数就是普通函数,即不在类中定义的函数,其中非成员 ...