AC自动机+状压DP

  首先对所有串建AC自动机,然后对于每个资源串,算出从串末走到其他资源串末所需的距离(中途避开非法点)

  也就是算出两两间的距离。。。然后就变成旅行商问题了。

  计算距离的时候要考虑一下。。直接从末尾走的话可能求出来的并不是最短路

  所以要从fail和ch(就是虚边和实边)一起转移,走实边的话加进队列,虚边只能更新距离(不然可能非法)

  但似乎正确性存疑?。。可能存在 三个资源串,分别按照最短距离拼在一起后会包含病毒串 的情况。。。

  反正我的程序会炸,但网上一些标程没事= =。。。另外本题数据极弱,随机数据就能艹翻一大坨标程系列

 #include<cstdio>
#include<iostream>
#include<cstring>
#define next NEXT
using namespace std;
const int maxn=,inf=;
int ch[maxn][],next[maxn][],fail[maxn],tot;
bool gg[maxn],uu[maxn];
int f1[maxn];
char s[maxn],mp[][];int len[],ed[];
int d[][],dis[maxn],d1[maxn];
int f[][],two[];
int dl[maxn],l,r;
int i,j,k,n,m; inline void getf1(int x){
int i,p=;f1[]=;
for(i=;i<=len[x];i++){
while(p&&mp[x][i]!=mp[x][p+])p=f1[p];
p+=mp[x][i]==mp[x][p+],f1[i]=p;
}
}
inline bool check(int x,int y){
int i,p=;
for(i=;i<=len[y];i++){
while(p&&mp[y][i]!=mp[x][p+])p=f1[p];
p+=mp[y][i]==mp[x][p+];
if(p==len[x])return ;
}
return ;
} inline void trie(int n,int id){
int i,p=;
for(i=;i<=n;i++){
s[i]-='';
if(!ch[p][s[i]])ch[p][s[i]]=++tot,p=tot;
else p=ch[p][s[i]];
}
if(!id)gg[p]=;else ed[id]=p;//printf(" gg:%d\n",p);
}
inline void getfail(){
int i,now,p,j;l=,r=,dl[]=;
while(l<r){
now=dl[++l];
for(i=;i<;/*printf("%d %d next:%d\n",now,i,next[now][i]),*/i++)if(ch[now][i]){
dl[++r]=j=next[now][i]=ch[now][i];
for(p=fail[now];p&&!ch[p][i];p=fail[p]);
if(!now)fail[j]=;else fail[j]=ch[p][i];
gg[j]|=gg[fail[j]];
}else{
for(p=fail[now];p&&!ch[p][i];p=fail[p]);
next[now][i]=ch[p][i];
}
}
for(i=;i<=tot;i++)if(gg[i])
for(j=/*,printf("!! gg:%d\n",i)*/;j<;j++)if(ch[i][j])gg[ch[i][j]]=;
}
inline void bfs(int s){
memset(dis,,(tot+)<<);memset(uu,,tot+);
int l=,r=,i,now,j;
if(!gg[s])dl[++r]=s,dis[s]=d1[s]=,uu[s]=;
for(i=fail[s];i;i=fail[i])if(!gg[i])dis[i]=;
while(l<r){
now=dl[++l];
for(i=;i<;i++)if(!gg[next[now][i]]&&!uu[next[now][i]]){
dl[++r]=next[now][i];uu[dl[r]]=;d1[dl[r]]=d1[now]+;
if(dis[dl[r]]==-)dis[dl[r]]=d1[dl[r]];
for(j=fail[dl[r]];j;j=fail[j])if(dis[j]==-)dis[j]=dis[dl[r]];
// if(s==16)printf("walk:%d->%d\n",now,next[now][i]);
}
}
// if(s==16)
// for(i=0;i<=tot;i++)printf(" %d->%d %d\n",s,i,dis[i]);
}
int main(){
freopen("in.txt","r",stdin);
for(i=two[]=;i<=;i++)two[i]=two[i-]<<;
for(scanf("%d%d",&n,&m);n&&m;scanf("%d%d",&n,&m)){
memset(ch,,(tot+)<<),memset(next,,(tot+)<<),memset(fail,,(tot+)<<),
memset(gg,,tot+),tot=; for(i=;i<=n;i++)
scanf("%s",mp[i]+),mp[i][]='%',len[i]=strlen(mp[i])-;
for(i=;i<n;i++)for(j=i+;j<=n;j++)if(len[i]>len[j])
swap(len[i],len[j]),swap(mp[i],mp[j]); for(i=;i<n;i++){
getf1(i);
for(j=i+;j<=n;j++)if(check(i,j)){gg[i]=;/*printf("%d in %d\n",i,j);*/break;}
}
int n1=;
for(i=;i<=n;i++)if(!gg[i])n1++,memcpy(mp[n1],mp[i],len[i]+),len[n1]=len[i];//,printf("%s\n",mp[n1]);
memset(gg,,n+); for(i=;i<=n1;i++)memcpy(s,mp[i],len[i]+),trie(len[i],i);
for(i=;i<=m;i++)scanf("%s",s+),s[]='%',trie(strlen(s)-,);
getfail(); for(i=;i<=n1;puts(""),i++){
bfs(ed[i]);
for(j=;j<=n1;/*printf("%s-->%s %d\n",mp[i]+1,mp[j]+1,d[i][j]),*/j++)if(dis[ed[j]]!=-)d[i][j]=dis[ed[j]];else d[i][j]=inf;
} int mx=<<n1;
for(i=;i<mx;i++)memset(f[i],,(n1+)<<);
for(i=;i<=n1;i++)f[two[i-]][i]=len[i];
for(i=;i<mx;i++){
for(j=;j<=n1;j++)if(i&two[j-])
for(k=;k<=n1;k++)if(k!=j&&(i&two[k-])&&d[k][j]<inf)
f[i][j]=min(f[i][j],f[i^two[j-]][k]+d[k][j]);
}
int ans=inf;
for(i=;i<=n1;i++)ans=min(ans,f[mx-][i]);
}
return ;
}

[HDU3247]Resource Archiver的更多相关文章

  1. HDU3247 Resource Archiver —— AC自动机 + BFS最短路 + 状压DP

    题目链接:https://vjudge.net/problem/HDU-3247 Resource Archiver Time Limit: 20000/10000 MS (Java/Others)  ...

  2. HDU-3247 Resource Archiver(AC自动机+BFS)

    Description Great! Your new software is almost finished! The only thing left to do is archiving all ...

  3. 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 ...

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

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

  5. 【HDU3247】 Resource Archiver(DP+AC自动机+最短路)

    Resource Archiver Time Limit: 10000MS   Memory Limit: 100000KB   64bit IO Format: %I64d & %I64u ...

  6. HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)

    题目链接:Resource Archiver 解析:n个正常的串.m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少. AC自己主动机 + bfs + 状态压缩DP ...

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

    \(\quad\)Great! Your new software is almost finished! The only thing left to do is archiving all you ...

  8. HDU 3247 Resource Archiver (AC自动机+BFS+状压DP)

    题意:给定 n 个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. 析:先把所有的文本串和病毒都插入到AC自动机上,不过标记不一样,可以给病毒标记-1, ...

  9. Resource Archiver HDU - 3247 AC自动机+BFS+状压

    题意: 给出n个资源串,m个病毒串,现在要如何连接资源串使得不含病毒串(可以重叠,样例就是重叠的). 题解: 这题的套路和之前的很不同了,之前的AC自动机+DP的题目一般都是通过teir图去转移, 这 ...

随机推荐

  1. jQuery: $.extend()用法总结

    1.重载原型 $.extend({},src1,src2,src3...) Jquery的扩展方法extend是我们在写插件的过程中常用的方法,该方法有一些重载原型. 它的含义是将src1,src2, ...

  2. java进程脱离终端运行

    关于 java 进程脱离终端放入后台运行的问题,首先想到是使用nohup命令: 研究了一下tomcat启动脚本.jenkins.war启动方式以及其他linux命令,结论是在目前的linux系统上不使 ...

  3. UWP TextBox私人定制

    这次私人定制的是背景透明的TextBox,普通的TextBox在获取焦点后,背景色就变白色了. 下面的代码可以让TextBox的背景始终是透明的. 其实很简单,就修改了 <Setter Prop ...

  4. Python的文件及异常

    1. Python的文件及异常 1.1 文件操作 1.1.1 从文件中读取数据 许多情况下,我们的信息是存储在文本中的.例如对用户行为的分析,用户访问系统或者网站的访问信息会被存储于文本中,然后对文本 ...

  5. SQL Server 2016 行级别权限控制

    背景 假如我们有关键数据存储在一个表里面,比如人员表中包含员工.部门和薪水信息.只允许用户访问各自部门的信息,但是不能访问其他部门.一般我们都是在程序端实现这个功能,而在sqlserver2016以后 ...

  6. [编织消息框架][JAVA核心技术]动态代理应用1

    前面几篇介绍,终于到了应用阶段啦,我们来做一个RPC来加强学过的知识 做基础核心时先确定解决什么问题,提供什么服务,同将来扩展等 rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服 ...

  7. JavaScript实现ZLOGO: 用语法树实现多层循环

    原址: https://zhuanlan.zhihu.com/p/32571516 照例先上演示弱效果图. 演示地址照旧: 代码如下: 开始 循环4次 循环4次 前进50 左转90度 到此为止 右转9 ...

  8. Layout 不可思议(一)—— CSS 实现自适应的正方形卡片

    最近被一个布局问题给难住了,枉我一向自称掌握最好的前端技能是 CSS,写完博客就得敷脸去 需求是实现一个自适应的正方形卡片,效果如下: 顺便(开个坑)写个系列,总结那些设计精妙的布局结构 本次页面的 ...

  9. Git与GitHub学习笔记(八)git如何同时同步提交到码云和GitHub上

    前言: 今天github push代码一直push不上去,打算就备份一份代码带国内开源码云上. Github容易出现的情况是: 国内访问速度比较慢, 如果被墙掉的话,就直接没发使用了 如果开源个PHP ...

  10. Jenkins 学习笔记(三):我们的JAVA 项目是这么发布的

    发布拓扑 1. 拓扑图 2. 流程说明: Git 插件从 Git Server 上面拉取源代码. Maven 插件将源代码安装我们设定的指令进行编译打包,存放于项目的 WorkSpace. Publi ...