HDU 5384 Danganronpa (Trie树)
题意:给出两个集合S和T,集合中每个元素是个字符串,而T集合中任一元素都是个子弹,可以打S中的任一怪物,如果子弹是怪物的子串,那么才有伤害值1,若在怪物中出现多次,次数为该子弹打到该怪物的伤害值。每个子弹可以射不同怪物分别一次。求用完所有子弹,每个怪物受到的伤害值。
思路:先将所有子弹插到Trie树中。穷举每个怪物,将其所有的子串在Trie树中找,统计出现的次数,并输出。
(1)插子弹时在结点中记录以该结点为结束的有多少个子弹。
(2)每个怪物只需要截取size个str[i...end]在树中查找。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N=; int n, m;
string str[N];
char s[N]; struct node
{
int num; //以本节点结尾的单词个数
node *child[]; //孩子
} pos[N*];
node *tree_gen; int node_cnt;
node * create_node()
{
pos[node_cnt].num=;
for(int i=; i<; i++) pos[node_cnt].child[i]=;
return &pos[node_cnt++];
} void insert_tree(char *p)
{
node *node_p=tree_gen; //指向树根 while(*p!='\0')
{
if( node_p->child[*p-'a']== ) //还没有这叉,就要建
{
node *new_node=create_node(); //创建新节点
node_p->child[*p-'a']=new_node; //连接
node_p=new_node;
}
else //已有这叉,继续往下
node_p=node_p->child[*p-'a']; if( *(p+)=='\0' ) node_p->num++; //以此单词为结尾的
p++;
}
} int check(string t)
{
int ans=;
node *node_p=tree_gen; //指向树根
int r=;
while( node_p!= && r<t.size() )
{
if(node_p->child[ t[r]-'a' ])
node_p=node_p->child[ t[r]-'a' ];
else break;
r++;
ans+=node_p->num;
}
return ans;
} int cal(string &t)
{
int ans=;
for(int i=; i<t.size(); i++)
{
ans+=check(t.substr(i));
}
return ans;
} int main()
{
//freopen("input.txt", "r", stdin);
int t;
cin>>t;
while(t--)
{
scanf("%d%d", &n, &m);
node_cnt=;
tree_gen=create_node(); for(int i=; i<n; i++)
{
cin>>str[i];
}
for(int i=; i<m; i++)
{
scanf("%s",s);
insert_tree(s);
}
for(int i=; i<n; i++)
{
printf("%d\n", cal(str[i]));
}
}
return ;
}
AC代码
HDU 5384 Danganronpa (Trie树)的更多相关文章
- Hdu 5384 Danganronpa (AC自动机模板)
题目链接: Hdu 5384 Danganronpa 题目描述: 给出n个目标串Ai,m个模式串Bj,问每个目标串中m个模式串出现的次数总和为多少? 解题思路: 与Hdu 2222 Keywords ...
- HDU 5384 Danganronpa (AC自己主动机模板题)
题意:给出n个文本和m个模板.求每一个文本中全部模板出现的总次数. 思路:Trie树权值记录每一个模板的个数.对于每一个文本跑一边find就可以. #include<cstdio> #in ...
- hdu 5384 Danganronpa(字典树)
题意: f(A,B)表示:B在A中作为子串出现的次数. 题目给出n个证据,m个子弹 Ai是证据.Bi是子弹.题目问:全部Bi对每一个Ai造成的伤害是多少,即每一个Bi在Ai中出现的次数总和. 解析: ...
- hdu 5384 Danganronpa
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 思路:没学自动机时以为是道KMP然后就tle了好几把,AC自动机模板题 #include<cs ...
- hdu 4622 Reincarnation trie树+树状数组/dp
题意:给你一个字符串和m个询问,问你l,r这个区间内出现过多少字串. 连接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 网上也有用后缀数组搞得. 思路 ...
- HDU 5384 Danganronpa (2015年多校比赛第8场)
1.题目描写叙述:点击打开链接 2.解题思路:本题利用字典树解决.本题要求查找全部的B[j]在A[i]中出现的总次数.那么我们能够建立一颗字典树,将全部的B[j]插入字典树,因为一个串的全部字串相当于 ...
- 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 ...
- HDU 5384——Danganronpa——————【AC自动机】
Danganronpa Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- HDU 5384 字典树、AC自动机
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...
随机推荐
- POJ3164 Command Network(最小树形图)
图论填个小坑.以前就一直在想,无向图有最小生成树,那么有向图是不是也有最小生成树呢,想不到还真的有,叫做最小树形图,网上的介绍有很多,感觉下面这个博客介绍的靠谱点: http://www.cnblog ...
- CF 50E. Square Equation Roots
思路:这题的关键就是重复根只可能是整数. 这样先求出所有的根的数目,在减去重复的根. 代码如下: #include <iostream> #include <cstring> ...
- Understanding node.js
Node.js has generally caused two reactions in people I've introduced it to. Basically people either ...
- Spring框架学习之第7节
配置Bean的细节 ☞尽量使用scope=”singleton”,不要使用prototype,因为这样对我们的性能影响较大 ②如何给集合类型注入值 Java中主要的map,set,list / 数组 ...
- QTreeView使用点点滴滴
QTreeView比较复杂,在这里记下所有用到的操作: ------------------------------------------------------------------------ ...
- Java:文件类File的详解
File类的常用方法: 1.创建 boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立创建文件,而 ...
- J2ee 巴巴网站制作(二)
导入spring jar包:
- SSIS -->> Variable
变量的特点: 1)大小写敏感 2)可见范围限制,里层可以看到外层,外层看不到里层的: 在属性窗口开启EvaluateAsExpression选项可以支持expression动态赋值变量
- 更改win7资源管理器启动位置
打开资源管理器属性,在目标(T)后边加上: /e,::{20D04FE0-3AEA-1069-A2D8-08002B30309D} 俺滴笨笨原本目标(T)是: %windir%\explorer.ex ...
- Line Search and Quasi-Newton Methods 线性搜索与拟牛顿法
Gradient Descent 机器学习中很多模型的参数估计都要用到优化算法,梯度下降是其中最简单也用得最多的优化算法之一.梯度下降(Gradient Descent)[3]也被称之为最快梯度(St ...