题意:给出两个集合S和T,集合中每个元素是个字符串,而T集合中任一元素都是个子弹,可以打S中的任一怪物,如果子弹是怪物的子串,那么才有伤害值1,若在怪物中出现多次,次数为该子弹打到该怪物的伤害值。每个子弹可以射不同怪物分别一次。求用完所有子弹,每个怪物受到的伤害值。

思路:先将所有子弹插到Trie树中。穷举每个怪物,将其所有的子串在Trie树中找,统计出现的次数,并输出。

  (1)插子弹时在结点中记录以该结点为结束的有多少个子弹。

  (2)每个怪物只需要截取size个str[i...end]在树中查找。

  1. #include <bits/stdc++.h>
  2. #define LL long long
  3. using namespace std;
  4. const int N=;
  5.  
  6. int n, m;
  7. string str[N];
  8. char s[N];
  9.  
  10. struct node
  11. {
  12. int num; //以本节点结尾的单词个数
  13. node *child[]; //孩子
  14. } pos[N*];
  15. node *tree_gen;
  16.  
  17. int node_cnt;
  18. node * create_node()
  19. {
  20. pos[node_cnt].num=;
  21. for(int i=; i<; i++) pos[node_cnt].child[i]=;
  22. return &pos[node_cnt++];
  23. }
  24.  
  25. void insert_tree(char *p)
  26. {
  27. node *node_p=tree_gen; //指向树根
  28.  
  29. while(*p!='\0')
  30. {
  31. if( node_p->child[*p-'a']== ) //还没有这叉,就要建
  32. {
  33. node *new_node=create_node(); //创建新节点
  34. node_p->child[*p-'a']=new_node; //连接
  35. node_p=new_node;
  36. }
  37. else //已有这叉,继续往下
  38. node_p=node_p->child[*p-'a'];
  39.  
  40. if( *(p+)=='\0' ) node_p->num++; //以此单词为结尾的
  41. p++;
  42. }
  43. }
  44.  
  45. int check(string t)
  46. {
  47. int ans=;
  48. node *node_p=tree_gen; //指向树根
  49. int r=;
  50. while( node_p!= && r<t.size() )
  51. {
  52. if(node_p->child[ t[r]-'a' ])
  53. node_p=node_p->child[ t[r]-'a' ];
  54. else break;
  55. r++;
  56. ans+=node_p->num;
  57. }
  58. return ans;
  59. }
  60.  
  61. int cal(string &t)
  62. {
  63. int ans=;
  64. for(int i=; i<t.size(); i++)
  65. {
  66. ans+=check(t.substr(i));
  67. }
  68. return ans;
  69. }
  70.  
  71. int main()
  72. {
  73. //freopen("input.txt", "r", stdin);
  74. int t;
  75. cin>>t;
  76. while(t--)
  77. {
  78. scanf("%d%d", &n, &m);
  79. node_cnt=;
  80. tree_gen=create_node();
  81.  
  82. for(int i=; i<n; i++)
  83. {
  84. cin>>str[i];
  85. }
  86. for(int i=; i<m; i++)
  87. {
  88. scanf("%s",s);
  89. insert_tree(s);
  90. }
  91. for(int i=; i<n; i++)
  92. {
  93. printf("%d\n", cal(str[i]));
  94. }
  95. }
  96. return ;
  97. }

AC代码

HDU 5384 Danganronpa (Trie树)的更多相关文章

  1. Hdu 5384 Danganronpa (AC自动机模板)

    题目链接: Hdu 5384 Danganronpa 题目描述: 给出n个目标串Ai,m个模式串Bj,问每个目标串中m个模式串出现的次数总和为多少? 解题思路: 与Hdu 2222  Keywords ...

  2. HDU 5384 Danganronpa (AC自己主动机模板题)

    题意:给出n个文本和m个模板.求每一个文本中全部模板出现的总次数. 思路:Trie树权值记录每一个模板的个数.对于每一个文本跑一边find就可以. #include<cstdio> #in ...

  3. hdu 5384 Danganronpa(字典树)

    题意: f(A,B)表示:B在A中作为子串出现的次数. 题目给出n个证据,m个子弹 Ai是证据.Bi是子弹.题目问:全部Bi对每一个Ai造成的伤害是多少,即每一个Bi在Ai中出现的次数总和. 解析: ...

  4. hdu 5384 Danganronpa

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 思路:没学自动机时以为是道KMP然后就tle了好几把,AC自动机模板题 #include<cs ...

  5. hdu 4622 Reincarnation trie树+树状数组/dp

    题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...

  6. HDU 5384 Danganronpa (2015年多校比赛第8场)

    1.题目描写叙述:点击打开链接 2.解题思路:本题利用字典树解决.本题要求查找全部的B[j]在A[i]中出现的总次数.那么我们能够建立一颗字典树,将全部的B[j]插入字典树,因为一个串的全部字串相当于 ...

  7. 2015 Multi-University Training Contest 8 hdu 5384 Danganronpa

    Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  8. HDU 5384——Danganronpa——————【AC自动机】

    Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  9. HDU 5384 字典树、AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...

随机推荐

  1. javascript 注意事项

    1.submit input 标签的 type里的submit是提交表单的按钮 提交时应注意 为 标签加上 “name=""”字段和form标签,才能达到想要的效果  2.正则表达 ...

  2. Form的用法

    提交页面: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w ...

  3. uva 11090

    I I U P C 2 0 0 6 Problem G: Going in Cycle!! Input: standard input Output: standard output You are ...

  4. UITableView中cell的圆角(第一个和最后一个)

    , , _width, _height)];     ;     view.clipsToBounds = YES;          _viewDetal = [[UIView alloc]init ...

  5. Android ListVIew 详解(一)

    在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.抽空把对ListView的使用做了整理,并写了个小例子,如下图. 列表的显示需要三 ...

  6. sql server 存储过程,事务

    1.存储过程,事务 CREATE PROCEDURE Proc_ceshi @id int, ), @returnval int output AS BEGIN SET NOCOUNT ON; Set ...

  7. DMS平台从.NET 1.1升级到.NET 4.0的升级步骤

    1)复制新增的项目到4.0平台解决方案对应目录,添加到到解决方案中:2)合并公共文件(比如修改了FormMain主界面.基础类库.售后界面的修改)3)控件的修订(Dev少数属性可能需要手工调整为新的方 ...

  8. Android 中建立一个OpenGL ES的开发环境

    转自: http://wiki.eoe.cn/page/Building_an_OpenGL_ES_Environment.html 负责人:zhangql原文链接:http://docs.eoean ...

  9. 8天学通MongoDB——第二天 细说增删查改

    原文地址:http://www.cnblogs.com/huangxincheng/archive/2012/02/19/2357846.html 看过上一篇,相信大家都会知道如何开启mongodb了 ...

  10. YARN集群维护部分问题汇总

    云梯开发人员在云梯Yarn集群的搭建和维护过程中做了许多工作,本文选择这期间部分较为典型的问题,通过对这些问题的分析和解决方案,为大家分享分布式系统问题调查的经验. 调查的问题 1. 2013年初引入 ...