hdu 3247 AC自动+状压dp+bfs处理
Resource Archiver
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 100000/100000 K (Java/Others)
Total Submission(s): 2382 Accepted Submission(s): 750
Wait a minute… you realized that it isn’t as easy as you thought. Think about the virus killers. They’ll find your software suspicious, if your software contains one of the m predefined virus codes. You absolutely don’t want this to happen.
Technically, resource files and virus codes are merely 01 strings. You’ve already convinced yourself that none of the resource strings contain a virus code, but if you make the archive arbitrarily, virus codes can still be found somewhere.
Here comes your task (formally): design a 01 string that contains all your resources (their occurrences can overlap), but none of the virus codes. To make your software smaller in size, the string should be as short as possible.
/*
hdu 3247 AC自动+状压dp+bfs处理 给你n个正常子串,m个病毒子串,求出最短的字符串(包含所有正常子串,不包含病毒串) 因为正常子串只有十个,所以考虑二进制来记录。
即dp[i][j]表示 包含的正常串的状态为i,最后一步的状态为j的最短情况.
然后试了下发现超内存 卒~ 然后膜拜大神,发现我们可以预处理出来正常串之间的最短距离. 像这样我们只需要枚举所有的
正常串. 而我原先那个思路需要枚举所有的节点总共需要dp[1<<10][60040]. 而对于通过bfs优化后
我们只需要枚举正常串 最多有11个 -> dp[1<<10][11]. hhh-2016-04-30 14:34:51
*/
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <functional>
#include <map>
using namespace std;
#define lson (i<<1)
#define rson ((i<<1)|1)
typedef unsigned long long ll;
typedef unsigned int ul;
const int mod = 20090717;
const int INF = 0x3f3f3f3f;
const int N = 100050;
int cnt;
int n,m;
int dp[1<<10][205];
int G[205][205];
int pos[205];
struct Tire
{
int nex[N][2],fail[N],ed[N]; int root,L;
int newnode()
{
for(int i = 0; i < 2; i++)
nex[L][i] = -1;
ed[L++] = 0;
return L-1;
} void ini()
{
L = 0,root = newnode();
} void inser(char buf[],int val)
{
int len = strlen(buf);
int now = root;
for(int i = 0; i < len; i++)
{
int ta = buf[i]-'0';
if(nex[now][ta] == -1)
nex[now][ta] = newnode();
now = nex[now][ta];
}
if(val < 0)
ed[now] = val;
else
ed[now] = (1<<val);
} void build()
{
queue<int >q;
fail[root] = root;
for(int i = 0; i < 2; i++)
if(nex[root][i] == -1)
nex[root][i] = root;
else
{
fail[nex[root][i]] = root;
q.push(nex[root][i]);
}
while(!q.empty())
{
int now = q.front();
q.pop();
if(ed[fail[now]] < 0)
ed[now] = ed[fail[now]];
else if(ed[now] == 0)
ed[now] = ed[fail[now]];
for(int i = 0; i < 2; i++)
{
if(nex[now][i] == -1)
nex[now][i] = nex[fail[now]][i];
else
{
fail[nex[now][i]] = nex[fail[now]][i];
q.push(nex[now][i]);
}
}
}
}
int dis[N];
void Path(int k)
{
int now;
queue<int >q;
q.push(pos[k]);
memset(dis,-1,sizeof(dis));
dis[pos[k]] = 0;
while(!q.empty())
{
now = q.front();
q.pop();
for(int i =0;i < 2;i++)
{
int t = nex[now][i];
if(dis[t] < 0 && ed[t] >= 0)
{
dis[t] = dis[now]+1;
q.push(t);
}
}
}
for(int i = 0;i < cnt;i++)
{
G[k][i] = dis[pos[i]];
}
} int Min(int a,int b)
{
if(a < 0)
return b;
else if(b < 0)
return a;
else
return min(a,b);
} void solve()
{
memset(dp,-1,sizeof(dp));
dp[0][0] = 0; for(int i = 0;i < (1<<n);i++)
{
for(int j = 0;j < cnt;j++)
{
if(dp[i][j] < 0)
continue;
for(int k = 0;k < cnt;k++)
{
if(G[j][k] < 0)
continue;
int t = (i|ed[pos[k]]);
dp[t][k] = Min(dp[i][j] + G[j][k],dp[t][k]);
}
}
}
int ans = -1;
for(int i = 0;i < cnt;i++)
{
ans = Min(ans,dp[(1<<n)-1][i]);
}
cout << ans <<"\n";
}
}; Tire ac;
char buf[N];
int main()
{
while(scanf("%d%d",&n,&m)==2 && n && m)
{
ac.ini();
for(int i = 0; i < n; i++)
{
scanf("%s",buf);
ac.inser(buf,i);
}
for(int i =0 ; i < m; i++)
{
scanf("%s",buf);
ac.inser(buf,-1);
}
ac.build();
pos[0] = 0;
cnt = 1;
for(int i = 0; i < ac.L; i++)
{
if(ac.ed[i] > 0)
pos[cnt++] = i;
}
memset(G,-1,sizeof(G));
for(int i = 0; i < cnt; i++)
ac.Path(i);
ac.solve();
}
return 0;
}
hdu 3247 AC自动+状压dp+bfs处理的更多相关文章
- hdu 2825 aC自动机+状压dp
Wireless Password Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 3247 Resource Archiver(AC自动机 + 状压DP + bfs预处理)题解
题意:目标串n( <= 10)个,病毒串m( < 1000)个,问包含所有目标串无病毒串的最小长度 思路:貌似是个简单的状压DP + AC自动机,但是发现dp[1 << n][ ...
- BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS
BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...
- HDU 3681 Prison Break(状压DP + BFS)题解
题意:一张图,F是起点,Y是必须要到的点,D不能走,G可以充电.可以往四个方向走,每走一步花费一个电,走到G可以选择充满电或者不充,每个G只能充一次.问你走遍Y的最小初始点亮.number(G) + ...
- BZOJ1559 [JSOI2009]密码 【AC自动机 + 状压dp】
题目链接 BZOJ1559 题解 考虑到这是一个包含子串的问题,而且子串非常少,我们考虑\(AC\)自动机上的状压\(dp\) 设\(f[i][j][s]\)表示长度为\(i\)的串,匹配到了\(AC ...
- HDU 5765 Bonds(状压DP)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...
- 计蒜客 30994 - AC Challenge - [状压DP][2018ICPC南京网络预赛E题]
题目链接:https://nanti.jisuanke.com/t/30994 样例输入: 5 5 6 0 4 5 1 1 3 4 1 2 2 3 1 3 1 2 1 4 样例输出: 55 样例输入: ...
- HDU 3001 Travelling (状压DP,3进制)
题意: 给出n<=10个点,有m条边的无向图.问:可以从任意点出发,至多经过同一个点2次,遍历所有点的最小费用? 思路: 本题就是要卡你的内存,由于至多可经过同一个点2次,所以只能用3进制来表示 ...
- hdu 4778 Gems Fight! 状压dp
转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...
随机推荐
- 201621123068 Week03-面向对象入门
1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识点组织起来.请使用工具画出本周学习到的知识点及知识点之间的联系.步骤如下: 1.1 写出你 ...
- MySQL 服务安装及命令使用
MySQL 服务安装及命令使用 课程来源说明 本节实验后续至第17节实验为本课程的进阶篇,都基于 MySQL 官方参考手册制作,并根据实验楼环境进行测试调整改编.在此感谢 MySQL 的开发者,官方文 ...
- AWS EC2服务器的HTTPS负载均衡器配置过程
AWS EC2服务器配置负载均衡器步骤: 1.普通负载均衡器 至少两台EC2实例,这里以Centos6.7系统为例 启动之后先安装个apache的httpd服务器默认80端口,或者使用其他服务 ...
- Flask 学习 八 用户角色
角色在数据库中表示 app/models.py class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primar ...
- 第三篇:Python字符编码
一 .了解字符编码的知识储备 1计算机基础知识 1.2文本编辑器存取文件的原理(nodepat++,Pycharm,word) #.打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的 ...
- 我所知道的window.location
多说无益 直接上干货 假如一个地址为 http://127.0.0.1:5000/index.html?id=4 window.location.href -- 完整路径 -- http://127 ...
- python 字符串和字典
一.字符串操作 name = "my name is \t {name} and i am {year} years old" 1.首字母大写 print(name.capital ...
- SpringBoot项目如何进行打包部署
springboot的打包方式有很多种.有打成war的,有打成jar的,也有直接提交到github,通过jekins进行打包部署的.这里主要介绍如何打成jar进行部署.不推荐用war,因为spring ...
- [翻译]现代java开发指南 第三部分
现代java开发指南 第三部分 第三部分:Web开发 第一部分,第二部分,第三部分 =========================== 欢迎来到现代 Java 开发指南第三部分.在第一部分中,我们 ...
- GZip 压缩及解压缩
/// <summary> /// GZipHelper /// </summary> public class GZipHelper { /// <summary> ...