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 ...
随机推荐
- gulp 如何排除文件和文件夹
在网上找了好久,很多用gulp-ignore来处理,或者!来处理 经验证,gulp-ignore没有效果,如果有大神路过,还请指教:!一般的写法只能排除单个文件,以下直接写结论 1.如何排除单个文件 ...
- 使用Python编写的对拍程序
简介 支持数据生成程序模式, 只要有RE或者WA的数据点, 就会停止 支持数据文件模式, 使用通配符指定输入文件, 将会对拍所有文件 结束后将会打印统计信息 第一次在某目录执行,将会通过交互方式获取配 ...
- rabbitmq部署及配置与验证
1. 场景描述 朋友项目需要弄个测试环境,稍微帮忙了下,系统不复杂,但是需要自己安装mysql.Reids.Es.RabbitMq等,Mq主要用在同步用户信息与发送站内消息和短信上,RabbitMq以 ...
- day52 html进阶
目录 一.分组与嵌套 二.伪类选择器 三.伪元素选择器 四.选择器优先级 五.css属性相关 1 字体属性 2 文字属性 3 背景图片 4 边框 5 display属性 6 盒子模型 7 浮动 一.分 ...
- AbstractQueuedSynchronizer(AQS)抽丝剥茧深入了解JUC框架原理
目录 简介 Lock简单实用 主体框架 原理解析 独占锁 AQS数据结构 CLH数据结构 acquire实现步骤 addWaiter acquireQueued shouldParkAfterFail ...
- shell专题(八):read读取控制台输入
1.基本语法 read(选项)(参数) 选项: -p:指定读取值时的提示符: -t:指定读取值时等待的时间(秒). 参数 变量:指定读取值的变量名 2.案例实操 (1)提示7秒内,读取控制台输入的名称 ...
- MYSQL 之 JDBC(十): JDBC的元数据
可以从Connection对象中获得有关数据库管理系统的各种信息 获取这些信息的方法都是在DatabaseMetaData类中. DatabaseMetaData:描述数据库的元数据对象 Result ...
- python之爬虫(八)BeautifulSoup库的使用
上一篇文章的正则,其实对很多人来说用起来是不方便的,加上需要记很多规则,所以用起来不是特别熟练,而这节我们提到的beautifulsoup就是一个非常强大的工具,爬虫利器. beautifulSoup ...
- L1和L2正则化。L1为什么能产生稀疏值,L2更平滑
参考博客:https://zhuanlan.zhihu.com/p/35356992 https://zhuanlan.zhihu.com/p/25707761 https://www.zhihu.c ...
- LDAP脚本批量导出用户
背景:工作原因,搭建了LDAP服务,然后用户数过多,因为懒所以就通过python代码生成ldap脚本进行批量导入用户 1.整理用户名单,格式如下: 注:上述格式影响代码中的excel读取代码 2.py ...