题目链接:Resource Archiver

解析:n个正常的串。m个病毒串,问包括全部正常串(可重叠)且不包括不论什么病毒串的字符串的最小长度为多少。

AC自己主动机 + bfs + 状态压缩DP

用最短路预处理出状态的转移。能够优化非常多

AC代码:

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <queue>
  6. using namespace std;
  7.  
  8. const int INF = 0x3f3f3f3f;
  9. struct Trie{
  10. int next[60010][2], fail[60010], end[60010];
  11. int root, L;
  12. int newnode(){
  13. for(int i=0; i<2; i++) next[L][i] = -1;
  14. end[L++] = 0;
  15. return L-1;
  16. }
  17. void init(){
  18. L = 0;
  19. root = newnode();
  20. }
  21. void insert(char buf[], int id){
  22. int len = strlen(buf);
  23. int now = root;
  24. for(int i=0; i<len; i++){
  25. if(next[now][buf[i] - '0'] == -1)
  26. next[now][buf[i] - '0'] = newnode();
  27. now = next[now][buf[i] - '0'];
  28. }
  29. end[now] = id;
  30. }
  31. void build(){
  32. queue<int> Q;
  33. fail[root] = root;
  34. for(int i=0; i<2; i++)
  35. if(next[root][i] == -1) next[root][i] = root;
  36. else{
  37. fail[ next[root][i] ] = root;
  38. Q.push(next[root][i]);
  39. }
  40. while(!Q.empty()){
  41. int now = Q.front();
  42. Q.pop();
  43. if(end[ fail[now] ] == -1) end[now] = -1;
  44. else end[now] |= end[ fail[now] ];
  45. for(int i=0; i<2; i++)
  46. if(next[now][i] == -1) next[now][i] = next[ fail[now] ][i];
  47. else{
  48. fail[ next[now][i] ] = next[ fail[now] ][i];
  49. Q.push(next[now][i]);
  50. }
  51. }
  52. }
  53. int g[11][11];
  54. int dp[1025][11];
  55. int cnt;
  56. int pos[11];
  57. int dis[60010];
  58.  
  59. void bfs(int k){
  60. queue<int> q;
  61. memset(dis, -1, sizeof(dis));
  62. dis[pos[k]] = 0;
  63. q.push(pos[k]);
  64. while(!q.empty()){
  65. int now = q.front();
  66. q.pop();
  67. for(int i=0; i<2; i++){
  68. int tmp = next[now][i];
  69. if(dis[tmp] < 0 && end[tmp] >= 0){
  70. dis[tmp] = dis[now] + 1;
  71. q.push(tmp);
  72. }
  73. }
  74. }
  75. for(int i=0; i<cnt; i++) g[k][i] = dis[pos[i]];
  76. }
  77.  
  78. int solve(int n){
  79. pos[0] = 0;
  80. cnt = 1;
  81. for(int i=0; i<L; i++)
  82. if(end[i] > 0) pos[cnt++] = i;
  83. for(int i=0; i<cnt; i++) bfs(i);
  84.  
  85. for(int i=0; i<(1<<n); i++)
  86. for(int j=0; j<cnt; j++)
  87. dp[i][j] = INF;
  88. dp[0][0] = 0;
  89. for(int i=0; i<(1<<n); i++)
  90. for(int j=0; j<cnt; j++)
  91. if(dp[i][j] < INF){
  92. for(int k=0; k<cnt; k++){
  93. if(g[j][k] < 0) continue;
  94. if(j == k) continue;
  95. dp[i | end[pos[k]]][k] = min(dp[i | end[pos[k]]][k], dp[i][j] + g[j][k]);
  96. }
  97. }
  98. int ans = INF;
  99. for(int i=0; i<cnt; i++)
  100. ans = min(ans, dp[(1<<n)-1][i]);
  101. return ans;
  102. }
  103. };
  104.  
  105. char buf[1010];
  106. Trie ac;
  107.  
  108. int main(){
  109. #ifdef sxk
  110. freopen("in.txt", "r", stdin);
  111. #endif // sxk
  112. int n, m;
  113. while(scanf("%d%d", &n, &m) == 2){
  114. if(n == 0 && m == 0) break;
  115. ac.init();
  116. for(int i=0; i<n; i++){
  117. scanf("%s", buf);
  118. ac.insert(buf, 1<<i);
  119. }
  120. for(int i=0; i<m; i++){
  121. scanf("%s", buf);
  122. ac.insert(buf, -1);
  123. }
  124. ac.build();
  125. printf("%d\n", ac.solve(n));
  126. }
  127. return 0;
  128. }

HDU 3247 Resource Archiver (AC自己主动机 + BFS + 状态压缩DP)的更多相关文章

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

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

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

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

  3. POJ 3691 &amp; 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: ...

  4. HDU 2825 Wireless Password (AC自己主动机,DP)

    pid=2825">http://acm.hdu.edu.cn/showproblem.php? pid=2825 Wireless Password Time Limit: 2000 ...

  5. HDU 2896 病毒侵袭 (AC自己主动机)

    pid=2896">http://acm.hdu.edu.cn/showproblem.php?pid=2896 病毒侵袭 Time Limit: 2000/1000 MS (Java ...

  6. hdu 2222 Keywords Search ac自己主动机

    点击打开链接题目链接 Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Ja ...

  7. HDU 2896 病毒侵袭 AC自己主动机题解

    本题是在text里面查找key word的增强版.由于这里有多个text. 那么就不能够简单把Trie的叶子标志记录改动成-1进行加速了,能够使用其它技术.我直接使用个vis数组记录已经訪问过的节点, ...

  8. HDU - 2825 Wireless Password(AC自己主动机+DP)

    Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...

  9. HDU 2222 Keywords Search AC自己主动机入门题

    单词统计的题目,给出一些单词,统计有多少单词在一个文本中出现,最经典的入门题了. AC自己主动机的基础: 1 Trie. 以这个数据结构为基础的,只是添加一个fail指针和构造fail的函数 2 KM ...

随机推荐

  1. 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('[+=]', ...

  2. 深入理解async和await的作用及各种适用场景和用法

    https://www.cnblogs.com/yaopengfei/archive/2018/07/02/9249390.html https://www.cnblogs.com/xianyudot ...

  3. DeltaFish 小组成员及个人博客地址

    艾寅中  http://www.cnblogs.com/aiyz 陈志锴  http://www.cnblogs.com/chenzhikai 李   鑫  http://www.cnblogs.co ...

  4. vs for Mac中的启用Entity Framework Core .NET命令行工具

    在vs for Mac的工具菜单中已没有了Package Manager Console. 我们可以通过以下方法使用Entity Framework Core .NET命令行工具: 1.添加Nuget ...

  5. THREE.DecalGeometry(转载)

    function getDecalGeometry(position, direction){ var decalGeometry = new THREE.DecalGeometry( earthMe ...

  6. struts2.5.2 通配符问题_亲测有用

    学了一段时间struts2,跟着教程做,但发现struts2的版本不同,很多东西的使用是有差异的.例如之前遇到的创建sessionFactory的方式就跟之前版本有着明显的差异.今天又遇到一个问题,那 ...

  7. 通过PHP怎样取到android系统下apk应用的包名,版本号等信息

    公司项目关系,要求在通过PHP解析android系统应用apk包内的一切可用的信息.比如说:APK包名,版本号,版本名,安装权限等一系列关于对应包的信息.通过google查找相关的解决方案,都没有找到 ...

  8. Django - 数据获取

    Django - 数据获取 1.radio值获取 2.checkbox获取 3.select 获取 select 获取值,需要根据前端multiple来获取,get or getlist; 4.上传文 ...

  9. H5 web存储

    H5提供了两种在客户端存储数据的方式:localStorage 持久化的本地存储(浏览器关闭重新打开数据依然存在)sessionStorage 针对一个session的本地存储之前这些都是由cooki ...

  10. python--(socket与粘包解决方案)

    python--(socket与粘包解决方案) 一.socket: Socket 是任何一种计算机网络通讯中最基础的内容.例如当你在浏览器地址栏中输入 http://www.cnblogs.com/ ...