HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)
题目链接:Resource Archiver
解析:n个正常的串。m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少。
AC自己主动机 + bfs + 状态压缩DP
用最短路预处理出状态的转移。能够优化非常多
AC代码:
- #include <cstdio>
- #include <iostream>
- #include <cstring>
- #include <algorithm>
- #include <queue>
- using namespace std;
- const int INF = 0x3f3f3f3f;
- struct Trie{
- int next[60010][2], fail[60010], end[60010];
- int root, L;
- int newnode(){
- for(int i=0; i<2; i++) next[L][i] = -1;
- end[L++] = 0;
- return L-1;
- }
- void init(){
- L = 0;
- root = newnode();
- }
- void insert(char buf[], int id){
- int len = strlen(buf);
- int now = root;
- for(int i=0; i<len; i++){
- if(next[now][buf[i] - '0'] == -1)
- next[now][buf[i] - '0'] = newnode();
- now = next[now][buf[i] - '0'];
- }
- end[now] = id;
- }
- void build(){
- queue<int> Q;
- fail[root] = root;
- for(int i=0; i<2; i++)
- if(next[root][i] == -1) next[root][i] = root;
- else{
- fail[ next[root][i] ] = root;
- Q.push(next[root][i]);
- }
- while(!Q.empty()){
- int now = Q.front();
- Q.pop();
- if(end[ fail[now] ] == -1) end[now] = -1;
- else end[now] |= end[ fail[now] ];
- for(int i=0; i<2; i++)
- if(next[now][i] == -1) next[now][i] = next[ fail[now] ][i];
- else{
- fail[ next[now][i] ] = next[ fail[now] ][i];
- Q.push(next[now][i]);
- }
- }
- }
- int g[11][11];
- int dp[1025][11];
- int cnt;
- int pos[11];
- int dis[60010];
- void bfs(int k){
- queue<int> q;
- memset(dis, -1, sizeof(dis));
- dis[pos[k]] = 0;
- q.push(pos[k]);
- while(!q.empty()){
- int now = q.front();
- q.pop();
- for(int i=0; i<2; i++){
- int tmp = next[now][i];
- if(dis[tmp] < 0 && end[tmp] >= 0){
- dis[tmp] = dis[now] + 1;
- q.push(tmp);
- }
- }
- }
- for(int i=0; i<cnt; i++) g[k][i] = dis[pos[i]];
- }
- int solve(int n){
- pos[0] = 0;
- cnt = 1;
- for(int i=0; i<L; i++)
- if(end[i] > 0) pos[cnt++] = i;
- for(int i=0; i<cnt; i++) bfs(i);
- for(int i=0; i<(1<<n); i++)
- for(int j=0; j<cnt; j++)
- dp[i][j] = INF;
- dp[0][0] = 0;
- for(int i=0; i<(1<<n); i++)
- for(int j=0; j<cnt; j++)
- if(dp[i][j] < INF){
- for(int k=0; k<cnt; k++){
- if(g[j][k] < 0) continue;
- if(j == k) continue;
- dp[i | end[pos[k]]][k] = min(dp[i | end[pos[k]]][k], dp[i][j] + g[j][k]);
- }
- }
- int ans = INF;
- for(int i=0; i<cnt; i++)
- ans = min(ans, dp[(1<<n)-1][i]);
- return ans;
- }
- };
- char buf[1010];
- Trie ac;
- int main(){
- #ifdef sxk
- freopen("in.txt", "r", stdin);
- #endif // sxk
- int n, m;
- while(scanf("%d%d", &n, &m) == 2){
- if(n == 0 && m == 0) break;
- ac.init();
- for(int i=0; i<n; i++){
- scanf("%s", buf);
- ac.insert(buf, 1<<i);
- }
- for(int i=0; i<m; i++){
- scanf("%s", buf);
- ac.insert(buf, -1);
- }
- ac.build();
- printf("%d\n", ac.solve(n));
- }
- return 0;
- }
HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)的更多相关文章
- HDU 3247 Resource Archiver (AC自动机+BFS+状压DP)
题意:给定 n 个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. 析:先把所有的文本串和病毒都插入到AC自动机上,不过标记不一样,可以给病毒标记-1, ...
- HDU - 3247 Resource Archiver (AC自动机,状压dp)
\(\quad\)Great! Your new software is almost finished! The only thing left to do is archiving all you ...
- POJ 3691 & HDU 2457 DNA repair (AC自己主动机,DP)
http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...
- HDU 2825 Wireless Password (AC自己主动机,DP)
pid=2825">http://acm.hdu.edu.cn/showproblem.php? pid=2825 Wireless Password Time Limit: 2000 ...
- HDU 2896 病毒侵袭 (AC自己主动机)
pid=2896">http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java ...
- hdu 2222 Keywords Search ac自己主动机
点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Ja ...
- HDU 2896 病毒侵袭 AC自己主动机题解
本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...
- HDU - 2825 Wireless Password(AC自己主动机+DP)
Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...
- HDU 2222 Keywords Search AC自己主动机入门题
单词统计的题目,给出一些单词,统计有多少单词在一个文本中出现,最经典的入门题了. AC自己主动机的基础: 1 Trie. 以这个数据结构为基础的,只是添加一个fail指针和构造fail的函数 2 KM ...
随机推荐
- ZOJ1969-Hard to Believe, but True!
import re while True: x = raw_input() if(x == '0+0=0'): print 'True' break a,b,c = re.split('[+=]', ...
- 深入理解async和await的作用及各种适用场景和用法
https://www.cnblogs.com/yaopengfei/archive/2018/07/02/9249390.html https://www.cnblogs.com/xianyudot ...
- DeltaFish 小组成员及个人博客地址
艾寅中 http://www.cnblogs.com/aiyz 陈志锴 http://www.cnblogs.com/chenzhikai 李 鑫 http://www.cnblogs.co ...
- vs for Mac中的启用Entity Framework Core .NET命令行工具
在vs for Mac的工具菜单中已没有了Package Manager Console. 我们可以通过以下方法使用Entity Framework Core .NET命令行工具: 1.添加Nuget ...
- THREE.DecalGeometry(转载)
function getDecalGeometry(position, direction){ var decalGeometry = new THREE.DecalGeometry( earthMe ...
- struts2.5.2 通配符问题_亲测有用
学了一段时间struts2,跟着教程做,但发现struts2的版本不同,很多东西的使用是有差异的.例如之前遇到的创建sessionFactory的方式就跟之前版本有着明显的差异.今天又遇到一个问题,那 ...
- 通过PHP怎样取到android系统下apk应用的包名,版本号等信息
公司项目关系,要求在通过PHP解析android系统应用apk包内的一切可用的信息.比如说:APK包名,版本号,版本名,安装权限等一系列关于对应包的信息.通过google查找相关的解决方案,都没有找到 ...
- Django - 数据获取
Django - 数据获取 1.radio值获取 2.checkbox获取 3.select 获取 select 获取值,需要根据前端multiple来获取,get or getlist; 4.上传文 ...
- H5 web存储
H5提供了两种在客户端存储数据的方式:localStorage 持久化的本地存储(浏览器关闭重新打开数据依然存在)sessionStorage 针对一个session的本地存储之前这些都是由cooki ...
- python--(socket与粘包解决方案)
python--(socket与粘包解决方案) 一.socket: Socket 是任何一种计算机网络通讯中最基础的内容.例如当你在浏览器地址栏中输入 http://www.cnblogs.com/ ...