hdu_3247_Resource Archiver(AC自动机+bfs+TSP)
题目链接:hdu_3247_Resource Archiver
题意:
有n个资源串,m个病毒串,现在要将所有的资源串整合到一个串内,并且这个串不能包括病毒串,问最短的串长为多少
题解:
将资源串和病毒串都插入到AC自动机中,分别做好标记,然后用bfs求出0节点和所有资源串互相的最短距离,最后就是一个TSP的状态压缩DP。
#include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int AC_N=1e5+,tyn=;
struct AC_automation{
int tr[AC_N][tyn],so[AC_N],v[AC_N],Q[AC_N],fail[AC_N],tot;
inline int getid(char x){return x-'';}
void nw(){so[++tot]=,fail[tot]=,v[tot]=;memset(tr[tot],,sizeof(tr[tot]));}
void init(){tot=-,fail[]=-,nw();}
void insert(char *s,int idx,int fg,int x=){
for(int len=strlen(s),i=,w;i<len;x=tr[x][w],i++)
if(!tr[x][w=getid(s[i])])nw(),tr[x][w]=tot;
if(fg)so[x]=<<idx;else v[x]=;
}
void build(int head=,int tail=){
for(int i=;i<tyn;i++)if(tr[][i])Q[++tail]=tr[][i];
while(head<=tail)for(int x=Q[head++],i=;i<tyn;i++)
if(tr[x][i])fail[tr[x][i]]=tr[fail[x]][i],Q[++tail]=tr[x][i],
so[tr[x][i]]|=so[tr[fail[x]][i]],v[tr[x][i]]+=v[tr[fail[x]][i]];
else tr[x][i]=tr[fail[x]][i];
} }AC; char s[AC_N];
int path[][],pos[],dp[<<][],cnt,Q[AC_N],dis[AC_N],n,m; inline void up(int &a,int b){if(a>b)a=b;} void bfs(int u,int head=,int tail=)
{
memset(dis,-,sizeof(dis));
Q[++tail]=pos[u],dis[pos[u]]=;
while(head<=tail)
{
int now=Q[head++];
F(i,,)
{
int q=AC.tr[now][i];
if(dis[q]<&&!AC.v[now])dis[q]=dis[now]+,Q[++tail]=q;
}
}
F(i,,cnt)path[u][i]=dis[pos[i]];
} void fuck()//TSP的dp
{
memset(dp,-,sizeof(dp)),dp[][]=;
for(int i=;i<(<<n);i++)F(j,,cnt)if(dp[i][j]>=)F(k,,cnt)if(path[j][k]>=)
if(dp[i|AC.so[pos[k]]][k]==-)dp[i|AC.so[pos[k]]][k]=dp[i][j]+path[j][k];
else up(dp[i|AC.so[pos[k]]][k],dp[i][j]+path[j][k]);
int ans=INT_MAX;
F(i,,cnt)if(dp[(<<n)-][i]!=-)up(ans,dp[(<<n)-][i]);
printf("%d\n",ans==INT_MAX?-:ans);
} int main()
{
while(~scanf("%d%d",&n,&m)&&n+m)
{
AC.init(),cnt=;
F(i,,n-)scanf("%s",s),AC.insert(s,i,);
F(i,,m-)scanf("%s",s),AC.insert(s,i,);
AC.build();
F(i,,AC.tot)if(AC.so[i])pos[++cnt]=i;
F(i,,cnt)bfs(i);//求出0到所以资源串的距离和资源串到资源串之间的距离
fuck();
}
return ;
}
hdu_3247_Resource Archiver(AC自动机+bfs+TSP)的更多相关文章
- HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP
题目链接:https://vjudge.net/problem/HDU-3247 Resource Archiver Time Limit: 20000/10000 MS (Java/Others) ...
- HDU 3247 Resource Archiver (AC自动机+BFS+状压DP)
题意:给定 n 个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. 析:先把所有的文本串和病毒都插入到AC自动机上,不过标记不一样,可以给病毒标记-1, ...
- Resource Archiver HDU - 3247 AC自动机+BFS+状压
题意: 给出n个资源串,m个病毒串,现在要如何连接资源串使得不含病毒串(可以重叠,样例就是重叠的). 题解: 这题的套路和之前的很不同了,之前的AC自动机+DP的题目一般都是通过teir图去转移, 这 ...
- HDU-3247 Resource Archiver(AC自动机+BFS)
Description Great! Your new software is almost finished! The only thing left to do is archiving all ...
- HDU3247 Resource Archiver(AC自动机+BFS+DP)
题目,求最短的包含所有n个DNA片段且不包含任何一个病毒片段的序列. 容易用所有DNA片段和病毒片段建一个AC自动机,构造fail时处理一下各个结点后缀是DNA或者病毒的情况,然后dp[S][u]表示 ...
- HDU3247 Resource Archiver (AC自动机+spfa+状压DP)
Great! Your new software is almost finished! The only thing left to do is archiving all your n resou ...
- HDU - 3247 Resource Archiver (AC自动机,状压dp)
\(\quad\)Great! Your new software is almost finished! The only thing left to do is archiving all you ...
- BZOJ1195[HNOI2006]最短母串——AC自动机+BFS+状态压缩
题目描述 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. 输入 第一行是一个正整数n(n<=12),表示给定的字符串的 ...
- BZOJ1195 [HNOI2006]最短母串 AC自动机 bfs
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1195 题意概括 给出一堆串,然后求一个包含这些串的所有串的最短的中的字典序最小的. 题解 先造一个AC ...
随机推荐
- 关于mysql严格模式的开启、关闭
由于项目中对一些默认值设置问题,以及种种原因,mysql数据库需要使用非严格模式开发(mysql最近的版本默认是开启严格模式的). linux下mysql服务下操作步骤是: 1.进入mysql服务 ...
- webstrom30天免费试用期过后如何破解继续使用
之前下了ws 直接就用了 也没有破解 30天过去了 老是提示你 神烦 网上找了一堆注册码什么的 终于发现一个良心网站 http://idea.qinxi1992.cn/ 步骤看下面的图
- ssh爆破脚本
前些天,基友发我一个ssh爆破工具,看起来很吊的样子.然后我就无聊自己写了个py脚本的. 单线程:慢成狗----- #coding:utf-8 #author:jwong import threadi ...
- log4j基本使用方法
通过配置文件可知,我们需要配置3个方面的内容: 1.根目录(级别和目的地) 2.目的地(控制台和文件等) 3.输出样式 Log4j由三个重要的组件构成: 1.日志信息的优先级 日志信息的优先级从高到低 ...
- .NET中的SqlBulkCopy类用法
在开发过程中,经常会遇到向数据库插入大量数据的情况,那么如果是百万条数据,一条条的插入实在是太慢了,所以就有了SqlBulkCopy类. 本文中我将示范SqlBulkCopy类的不同应用. 以下面三张 ...
- git 克隆到本地linux目录的2种方式
登录到gitlab查看2种不同的地址 ssh 类型 地址 git@inc.xxxx:shiwf/xxxAdmin.git http类型 地址 http://inc.xxxx:8000/shiwf/xx ...
- ubuntu配置LAMP
1.安装Apache sudo apt-get install apache2 如果显示未找到软件则执行sudo apt-get update(建议使用ubuntu正在支持的系统版本,不在支持的版本可 ...
- Django之模型管理器filter处理问题
今天上班第一天,恭祝所有朋友新年快乐!! 最近在github上发现一个还不错的基于Django的开源博客项目,不过也许是版本原因,其中代码存在着些许问题,今天主要记录下其中的模型处理方法的部分. 这段 ...
- Angular JS Scope(作用域)
Scope(作用域) 是应用在 HTML (视图) 和 JavaScript (控制器)之间的纽带. Scope 是一个对象,有可用的方法和属性. Scope 可应用在视图和控制器上. 当你在 Ang ...
- how many different bst given n nodes?
Reference: http://stackoverflow.com/questions/3042412/with-n-no-of-nodes-how-many-different-binary-a ...