题意:给出两个集合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=100010; 5 6 int n, m; 7 string str[N]; 8 char s[N]; 9 10 struct node 11 { 12 int num; //以本节点结尾的单词个数 13 node *child[26]; //孩子 14 } pos[N*50]; 15 node *tree_gen; 16 17 int node_cnt; 18 node * create_node() 19 { 20 pos[node_cnt].num=0; 21 for(int i=0; i<26; i++) pos[node_cnt].child[i]=0; 22 return &pos[node_cnt++]; 23 } 24 25 void insert_tree(char *p) 26 { 27 node *node_p=tree_gen; //指向树根 28 29 while(*p!='