正题

题目链接:https://www.luogu.com.cn/problem/CF25E


题目大意

给出三个串,然后求一个最短的串包含这三个串。

1≤∣s1∣,∣s2∣,∣s3∣≤1051\leq |s_1|,|s_2|,|s_3|\leq 10^51≤∣s1​∣,∣s2​∣,∣s3​∣≤105


解题思路

把三个串状压,先跑出ACACAC自动机和每个节点包含的串的状态。

然后设fi,sf_{i,s}fi,s​表示目前到节点iii,已经包含串的状态是sss,然后bfsbfsbfs转移即可。

时间复杂度O(23∑∣s∣)O(2^3\sum |s|)O(23∑∣s∣)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define p(x,y) (((x)*n)+(y))
using namespace std;
const int N=3e5+10;
struct node{int to,next;
}a[N*3*26];
int n,t[N][26],k[N],fail[N];
int tot,ls[N<<3],dis[N<<3];
char s[N];
queue<int> q;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
int Insert(char *s){int x=0,l=strlen(s);for(int i=0;i<l;i++){int c=s[i]-'a';if(!t[x][c])t[x][c]=n++;x=t[x][c];}return x;
}
void GetFail(){for(int i=0;i<26;i++)if(t[0][i])q.push(t[0][i]);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<26;i++){if(t[x][i]){fail[t[x][i]]=t[fail[x]][i];q.push(t[x][i]);}else t[x][i]=t[fail[x]][i];}k[x]|=k[fail[x]];}return;
}
int bfs(){q.push(0);dis[0]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dis[y])continue;dis[y]=dis[x]+1;if(y/n==7)return dis[y]-1;q.push(y);}}return 0;
}
int main()
{n=1; for(int i=0;i<3;i++){scanf("%s",s);k[Insert(s)]|=(1<<i);}GetFail();for(int x=0;x<n;x++)for(int i=0;i<26;i++){int y=t[x][i];if(!y)continue;for(int s=0;s<7;s++)addl(p(s,x),p(s|k[y],y));}printf("%d\n",bfs());return 0;
}

CF25E-Test【AC自动机,bfs】相关推荐

  1. HDU3247 Resource Archiver(AC自动机+BFS+DP)

    题目,求最短的包含所有n个DNA片段且不包含任何一个病毒片段的序列. 容易用所有DNA片段和病毒片段建一个AC自动机,构造fail时处理一下各个结点后缀是DNA或者病毒的情况,然后dp[S][u]表示 ...

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

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

  3. 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...

  4. CDOJ1633 Video Game Combos [AC自动机+dp]

    题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...

  5. YBTOJ:单词频率(AC自动机)

    解析 我对力量一无所知 通过这题,可以看出我对AC自动机还是完全没有理解 qwq 首先容易想到: 建一课trie树,然后建树时记录每个串s的终点,这个点后面每被经过一次,就相当于出现一次该单词s 但是 ...

  6. 提高篇 第二部分 字符串算法 第4章 AC自动机

    https://blog.csdn.net/wangyh1008/article/details/81428056 [模板]AC自动机(加强版) 洛谷3796 AC自动机_A_loud_name-CS ...

  7. HDU - 3247 Resource Archiver(AC自动机+状压dp+bfs)

    题目链接:点击查看 题目大意:给出 n 个目标串和 m 个病毒串,要求构造出一个长度最短的,且包含全部 n 个目标串,但是不能包含任意一个病毒串的01字符串,输出其最短长度 题目分析:比较综合的一道题 ...

  8. [HNOI2006]最短母串问题——AC自动机+状压+bfs环形处理

    Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 32MB Input 第一行是一个正整数n(n< ...

  9. AC自动机算法及模板

    AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报  分类: AC自动机(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...

最新文章

  1. Cf Round #403 B. The Meeting Place Cannot Be Changed(二分答案)
  2. 列表-列表统计及删除方法扩展
  3. android开发版本,Android开发之版本统一规范
  4. mysql tungsten_使用tungsten将mysql的数据同步到hadoop
  5. 25款漂亮的 WordPress 杂志主题
  6. 荣禄[róng lù]
  7. JDBC 与ODBC的区别
  8. 多模块顺序_广东省考行测时间如何分配?答题顺序的建议?
  9. 耳机插入电脑插孔后只有一边有声音
  10. 【项目】数据仓库概述
  11. 搞懂WebRtc,语音社交源码的开发就入门了!
  12. Python实例:小游戏20148
  13. 【前端实例代码】用HTML、CSS和JavaScript创建一个简易图片编辑器(实现图片的亮度、饱和度、灰度、颜色反转、图片旋转镜面翻转等滤镜效果)
  14. proftpd mysql_ProFTPD支持MySQL添加虚拟用户认证及磁盘限额
  15. 如何压缩jpg图片大小
  16. css实现流星划过动画
  17. 汽车电子功能安全标准ISO26262解析(十)——HSI
  18. Android端2016年9月系统使用以及兼容测试
  19. PySide2----案例练习
  20. 【高速接口-RapidIO】2、RapidIO串行物理层的包与控制符号

热门文章

  1. python怎么获取lol皮肤名称_LOL手游免费皮肤获得方法 LOL手游皮肤怎么获得
  2. python base64编码_JS和Python实现AES算法
  3. cas 4.2.7 官方手册_海城市地区,保险手册核验的简单流程
  4. 360浏览器5兼容模式吗_个独模式真能将企业总体税负降低至5%吗,为何大家都热衷核定征收...
  5. 职称计算机还用考试,职称计算机考试注意事项
  6. tars框架php,TarsPHP: TARS-PHP是针对php使用tars二进制协议,以及tars平台整体运维、RPC等一系列能力的解决方案...
  7. 算法题目——最长连续序列
  8. 解决浏览器存储问题,不得不了解的cookie,localStorage和sessionStorage
  9. C++泛型编程实现哈希表(开散列法)
  10. 《C++ Primer》7.2节练习