BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
传送门 - BZOJ1195
题意概括
给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的。
题解
先造一个AC自动机,多模匹配嘛。
然后bfs在AC自动机上面走,两维状态,dis[i][j]表示已经走到过的串状态为i,在AC自动机上面的位置为j的最短距离。
然后这题居然要卡空间!
坑死了。
然后用了short
wa掉了。
发现short实在小的可怜,然后把几个大的数组的有必要的一个开了int,然后30MB卡着限制过去了~
开心!!
代码
- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <cstdlib>
- #include <cmath>
- using namespace std;
- struct Trie{
- int e,fail,next[];
- void init(){
- e=fail=;
- memset(next,,sizeof next);
- }
- }tree[];
- int cnt;
- void AC_Prepare(){
- cnt=;
- tree[].init(),tree[].init();
- for (int i=;i<;i++)
- tree[].next[i]=;
- }
- void add(char ch[],int bh){
- int len=strlen(ch),rt=,t;
- for (int i=;i<len;i++){
- t=ch[i]-'A';
- if (!tree[rt].next[t]){
- tree[++cnt].init();
- tree[rt].next[t]=cnt;
- }
- rt=tree[rt].next[t];
- }
- tree[rt].e|=<<bh;
- }
- void build_AC(){
- int q[],head=,tail=,rt,son,k;
- tree[].fail=,q[++tail]=;
- while (head<tail){
- rt=q[++head];
- for (int i=;i<;i++){
- son=tree[rt].next[i];
- if (!son){
- tree[rt].next[i]=tree[tree[rt].fail].next[i];
- continue;
- }
- k=tree[rt].fail;
- while (!tree[k].next[i])
- k=tree[k].fail;
- tree[son].fail=tree[k].next[i];
- tree[son].e|=tree[tree[k].next[i]].e;
- q[++tail]=son;
- }
- }
- }
- int n,head,tail,pre[<<][];
- short dis[<<][];
- bool f[<<][];
- char str[],chosen[<<][],ansstr[];
- struct Queue{
- short x,y;
- void push(int a,int b){
- x=a,y=b;
- }
- void pushout(int &a,int &b){
- a=x,b=y;
- }
- }q[];
- int main(){
- scanf("%d",&n);
- AC_Prepare();
- for (int i=;i<n;i++){
- scanf("%s",str);
- add(str,i);
- }
- build_AC();
- memset(f,,sizeof f);
- memset(dis,,sizeof dis);
- memset(q,,sizeof q);
- head=tail=;
- q[++tail].push(,);
- dis[][]=,f[][]=,pre[][]=;
- int ans=-,x,y,x_,y_;
- while (head<tail){
- q[++head].pushout(x,y);
- for (int i=;i<;i++){
- y_=tree[y].next[i];
- x_=x|tree[y_].e;
- if (f[x_][y_])
- continue;
- dis[x_][y_]=dis[x][y]+;
- chosen[x_][y_]=i;
- pre[x_][y_]=head;
- f[x_][y_]=;
- q[++tail].push(x_,y_);
- if (x_==(<<n)-){
- ans=tail;
- break;
- }
- }
- if (ans!=-)
- break;
- }
- q[ans].pushout(x,y);
- int ansdis=dis[x][y],xnow,ynow;
- for (int j=ansdis,i=ans;j>=&&i;j--,i=pre[xnow][ynow]){
- q[i].pushout(xnow,ynow);
- ansstr[j]=chosen[xnow][ynow]+'A';
- }
- for (int i=;i<=ansdis;i++)
- printf("%c",ansstr[i]);
- return ;
- }
BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs的更多相关文章
- BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的 ...
- Bzoj1195 [HNOI2006]最短母串 [AC自动机]
Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1304 Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...
- bzoj1195 [HNOI2006]最短母串 AC 自动机+状压+bfs
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1195 题解 建立 AC 自动机,然后构建出 trie 图. 然后直接在 trie 图上走.但是 ...
- BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图
BZOJ_1195_[HNOI2006]最短母串_AC自动机+BFS+分层图 Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2, ...
- 【bzoj1195】[HNOI2006]最短母串 AC自动机+状态压缩+BFS最短路
原文地址:http://www.cnblogs.com/GXZlegend/p/6825226.html 题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串 ...
- [HNOI2006]最短母串 (AC自动机+状压)
Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...
- BZOJ 1195: [HNOI2006]最短母串 AC自动机+状压+搜索
思路比较直接. 由于 $n$ 很小,直接定义 $f[i][j]$ 表示当前在自动机中的节点 $i,$ 被覆盖串的集合为 $j$ 的方案数. #include <bits/stdc++.h> ...
- [bzoj1195][HNOI2006]最短母串_动态规划_状压dp
最短母串 bzoj-1195 HNOI-2006 题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串. 注释:$1\le n\le 12$,$1\le ...
- Bzoj1195 [HNOI2006]最短母串 [状态压缩]
Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1304 Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...
随机推荐
- C# CEF 封装UserControl
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...
- Python中的包ImportError
前言 Python中的包给我提供了很好的代码组织,相似的功能模块放在同一个包内,不仅代码结构清晰,而且调用起来也比较方便(可以用*导入) 但是,我们在刚开始使用Python包的时候总是会遇到导入错误& ...
- Javaweb学习笔记——(四)——————JavaScript基础&DOM目录
1.案例一:在末尾添加节点 第一个:获取到ul标签 第二部:创建li标签 document.createElement("标签名称")方法 第三步:创建文本 document.cr ...
- 二、主目录 Makefile 分析(1)
2.1 uboot 版本号 uboot 的版本号分三个级别: VERSION:主版本号 PATCHLEVEL:次版本号,为补丁级别 SUBLEVEL:再次版本号 EXTRAVERSION:附加版本信息 ...
- socket 聊天室
服务端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- wpc 双工
在控制台部署wcf双工 这个可以被silverlight 使用 <?xml version="1.0" encoding="utf-8" ?> &l ...
- Linux之Ubuntu安装搜狗输入法
1.下载搜狗输入法安装包 搜狗官网:https://pinyin.sogou.com/linux/ 2.更新ubuntu内置的包管理器apt-get的软件源[如果中途安装失败,经常是此原因造成的] s ...
- django(一)验证码
这里讲讲在django中使用第三方插件验证码的流程. 一. 先安装pillow, 通过 python -m pip install pillow 二.安装完后,在官方网站上看操作过程.地址:pillo ...
- mysql架构解读~mysql的多源复制
一 场景需求 多源复制版本 5.7,目标主机5.6.21 4个DB机器的某些数据库需要数据汇总进行连表查询 二 进行搭建 1 导出相应的目的库 mysqldump -uuser -ppass ...
- Fragment的常用写法
一般通过add.show.hide相结合的方法来控制Fragment的显示和隐藏,这样不会再重写一遍Fragment的生命周期,节省了时间和内存,当然特殊需求除外. package com.examp ...