HDU 5384 Danganronpa (Trie树)

题意:给出两个集合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!=‘\0‘)
30     {
31         if( node_p->child[*p-‘a‘]==0 )  //还没有这叉,就要建
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+1)==‘\0‘ )        node_p->num++;      //以此单词为结尾的
41         p++;
42     }
43 }
44
45 int check(string t)
46 {
47     int ans=0;
48     node *node_p=tree_gen;  //指向树根
49     int r=0;
50     while( node_p!=0 && 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=0;
64     for(int i=0; i<t.size(); i++)
65     {
66         ans+=check(t.substr(i));
67     }
68     return ans;
69 }
70
71
72 int main()
73 {
74     //freopen("input.txt", "r", stdin);
75     int t;
76     cin>>t;
77     while(t--)
78     {
79         scanf("%d%d", &n, &m);
80         node_cnt=0;
81         tree_gen=create_node();
82
83         for(int i=0; i<n; i++)
84         {
85             cin>>str[i];
86         }
87         for(int i=0; i<m; i++)
88         {
89             scanf("%s",s);
90             insert_tree(s);
91         }
92         for(int i=0; i<n; i++)
93         {
94             printf("%d\n", cal(str[i]));
95         }
96     }
97     return 0;
98 }

AC代码

时间: 2024-10-12 12:26:24

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

HDU 1277 全文检索 (Trie树应用 好题)

全文检索 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1304    Accepted Submission(s): 416 Problem Description 我们大家经常用google检索信息,但是检索信息的程序是很困难编写的:现在请你编写一个简单的全文检索程序. 问题的描述是这样的:给定一个信息流文件,信息完全有数字组成,

HDU 5384 Danganronpa (字典树运用)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 题面: Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 512    Accepted Submission(s): 284 Problem Description Danganronpa is a vid

hdu 5384 Danganronpa(字典树)

题意: f(A,B)表示:B在A中作为子串出现的次数. 题目给出n个证据,m个子弹 Ai是证据,Bi是子弹,题目问:所有Bi对每个Ai造成的伤害是多少,即每个Bi在Ai中出现的次数总和. 解析: 不会AC自动机,所以就用字典树水了一发,没想到过了. 先把所有的Bi插入字典树中,然后枚举每个Ai的后缀,查询后缀的每个前缀在字典树中出现了几次. my code #include <cstdio> #include <cstring> #include <algorithm>

HDU 5384 Danganronpa(AC自动机)

Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 429    Accepted Submission(s): 248 Problem Description Danganronpa is a video game franchise created and developed by Spike Chunsof

HDU 5384 Danganronpa

Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 241    Accepted Submission(s): 137 Problem Description Danganronpa is a video game franchise created and developed by Spike Chunsof

hdu 5384 Danganronpa(基础AC自动机)

题意:多个模式串和多个待匹配串,求每个待匹配串对于所有模式串的匹配个数: 思路:1.与最裸的ac自动机的区别在于讯问后的叶子节点的count值会改变,在每次询问时count值不要清零: 2.对于多个串的保存直接用二维数组: #include<cstdio> #include<vector> #include<iostream> #include<algorithm> #include<cstring> using namespace std; c

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

Danganronpa Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 582    Accepted Submission(s): 323 Problem Description Danganronpa is a video game franchise created and developed by Spike Chunsoft

HDU 1251 Trie树模板题

1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define max(a,b) a>b?a:b #define F(i,a,b

HDU 5384 字典树、AC自动机

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 1 #include<stdio.h> 2 #include<string.h> 3 #include<string> 4 #include<iostream> 5 using namespace std; 6 struct node{ 7 int cnt; 8 node *next[26]; 9 node(){ 10 c