D.树之呼吸-肆之型-前缀统计
Time Limit: 1000 MS Memory Limit: 65536 K
Total Submit: 59 (8 users) Total Accepted: 7 (7 users) Special Judge: No
Description

给定 n 个字符串 S1,S2,...,Sn。

接下来进行 m 次询问,每次询问给定一个字符串 T,

求 S1 ~ Sn 中有多少个字符串是 T 的前缀。

Input

输入第一行为一个正整数 case,表示测试数据组数;

对于每组测试数据,输入第一行为一个正整数 n,表示给定的字符串数;

接下来 n 行,给出 n 个字符串 S1 ~ Sn;

接下来一行一个正整数 m,表示询问数;

接下来 m 行,给出 m 个询问串 T1 ~ Tm;

保证:

case <= 50;

给定串和询问串均只由大小写字母组成;

给定串和询问串的总长均不超过 2e5。

Output
对于每组测试数据,输出 m 行,每行一个整数,表示有多少个给定串是 T1 ~ Tm 的前缀。
Sample Input

2

3

aab

aa

a

3

aa

aab

aabc

3

ABA

ABA

AAB

3

AB

ABAab

AAB

Sample Output

2

3

3

0

2

1

Author
陈鑫

题意: 给定 n 个字符串 S1,S2,...,Sn.
接下来进行 m 次询问,每次询问给定一个字符串 T,
求 S1 ~ Sn 中有多少个字符串是 T 的前缀.
思路:给n个单词建一个字典树,在枚举Ti的前缀,看字典树中是否存在这个前缀,如果存在则答案加上这个单词出现的次数
注意:
这里正常来说按题意数组长度应该开2e5,但用memset会超时,正确做法是用fill并且去掉第一次初始化(把初始化放结尾),这里开1e5能过是因为数据水了,
注意字母有大小写A在a的前面,所以s[i]-'A',来得到字母的编号
ed[rt]标记不仅可以表示是否存在,也可以用来统计出现的次数
注意如果用了freopen则不能关闭流同步,也就是ios::sync_with_stdio(0),否则可以关闭流同步

 #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int amn=1e5+; ///这里正常来说应该开2e5,但用memset会超时,正确做法是用fill并且去掉第一次初始化(把初始化放结尾),这里开1e5能过是因为数据水了,
int tr[amn][],ed[amn],tot,x,ans,len,rt;
void init(){
memset(tr,,sizeof tr); ///在2e5的情况下的正确做法是用fill,不然用memset会超时
memset(ed,,sizeof ed);
tot=;
}
char s[amn];
void add(){
len=strlen(s),rt=;
for(int i=;i<len;i++){
x=s[i]-'A'; ///注意字母有大小写A在a的前面,所以s[i]-'A',来得到字母的编号
if(!tr[rt][x])tr[rt][x]=++tot;
rt=tr[rt][x];
}
ed[rt]++; ///这里由ed[rt]=1,变为了ed[rt]++,可以统计相同的单词出现了几次
}
void sol(){
len=strlen(s),rt=,ans=;
for(int i=;i<len;i++){
x=s[i]-'A';
if(!tr[rt][x])return; ///如果下面没结点就不用匹配了
rt=tr[rt][x];
if(ed[rt])ans+=ed[rt]; ///如果出现了一个单词,则答案加上单词出现的次数
}
}
int main(){
// freopen("in.txt","r",stdin);
// cin.sync_with_stdio(0);
///注意如果用了freopen则不能关闭流同步,也就是ios::sync_with_stdio(0),否则可以关闭流同步
int T,n,m;scanf("%d",&T);
while(T--){
scanf("%d",&n);
init();
while(n--){
cin>>s;
add();
}
scanf("%d",&m);
while(m--){
cin>>s;
sol();
printf("%d\n",ans);
}
}
}
/**
题意: 给定 n 个字符串 S1,S2,...,Sn.
接下来进行 m 次询问,每次询问给定一个字符串 T,
求 S1 ~ Sn 中有多少个字符串是 T 的前缀.
思路:给n个单词建一个字典树,在枚举Ti的前缀,看字典树中是否存在这个前缀,如果存在则答案加上这个单词出现的次数
注意:
这里正常来说按题意数组长度应该开2e5,但用memset会超时,正确做法是用fill并且去掉第一次初始化(把初始化放结尾),这里开1e5能过是因为数据水了,
注意字母有大小写A在a的前面,所以s[i]-'A',来得到字母的编号
ed[rt]标记不仅可以表示是否存在,也可以用来统计出现的次数
注意如果用了freopen则不能关闭流同步,也就是ios::sync_with_stdio(0),否则可以关闭流同步
**/

[字典树,trie树] 树之呼吸-肆之型-前缀统计的更多相关文章

  1. 数据结构图解(递归,二分,AVL,红黑树,伸展树,哈希表,字典树,B树,B+树)

    递归反转 二分查找 AVL树 AVL简单的理解,如图所示,底部节点为1,不断往上到根节点,数字不断累加. 观察每个节点数字,随意选个节点A,会发现A节点的左子树节点或右子树节点末尾,数到A节点距离之差 ...

  2. 字典树(Trie树)的实现及应用

    >>字典树的概念 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.与二叉查找树不同,Trie树的 ...

  3. [转载]字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  4. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  5. 『字典树 trie』

    字典树 (trie) 字典树,又名\(trie\)树,是一种用于实现字符串快速检索的树形数据结构.核心思想为利用若干字符串的公共前缀来节约储存空间以及实现快速检索. \(trie\)树可以在\(O(( ...

  6. 字典树trie学习

    字典树trie的思想就是利用节点来记录单词,这样重复的单词可以很快速统计,单词也可以快速的索引.缺点是内存消耗大 http://blog.csdn.net/chenleixing/article/de ...

  7. 【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介

    B  树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: ...

  8. 字典树 trie树 学习

    一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种   二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...

  9. 字典树(Trie)详解

    详解字典树(Trie) 本篇随笔简单讲解一下信息学奥林匹克竞赛中的较为常用的数据结构--字典树.字典树也叫Trie树.前缀树.顾名思义,它是一种针对字符串进行维护的数据结构.并且,它的用途超级广泛.建 ...

随机推荐

  1. Serverless 每周小报-20190610

    微软和 Red Hat 开源 KEDA:Fission 发布 1.3.0 博客精选 10 THINGS TO KNOW ABOUT SERVERLESS COMPUTING - BEFORE YOU ...

  2. jquery和zepto的异同

    相同点 相同点: zepto: 是jquery 的 阉割版 是为移动端开发的库 jQuery的轻量级替代品.文件大小比较小 只有8k左右 ,是目前功能库中最小的一个,尽管不大,zepto 所提供的工具 ...

  3. 二手iPhone,为什么没有火?

    据相关媒体报道,日前苹果准备向印度市场销售二手iPhone,以提高自己在这个市场内的竞争力,但却遭遇到了强烈的反对,首先是印度本土手机制造商担心二手iPhone会冲击他们的销售,让其本就微薄的利润更加 ...

  4. Autowired和Resource区别

    @Autowired和@Resource熟悉吧?是不是经常复制粘贴顺手就来,两者都是用来给成员变量自动装载,可是它俩到底有啥区别呢? 1.@Autowired与@Resource都可以用来装配bean ...

  5. 联想拯救者y7000使用体验

    前言 我以前的电脑是在电商平台买的二手电脑,期间觉得软件的运行速度慢,又在网上买了一个128G的固态硬盘安装上.就从大一到大四上学期这么使用了三年半的时间.因为自己需要运行一些吃内存的软件,而我的这个 ...

  6. 阿里sentinel说明及使用

    使用说明 如果只是为了让使 用Sentinel 的限流功能,只需要引入相关的jar包依赖. 添加依赖 添加相关模块的Adapter Sentinel为每个构建项目的各个组件都打包成了相应的Adapte ...

  7. docker部署tensorflow serving以及模型替换

    Using TensorFlow Serving with Docker 1.Ubuntu16.04下安装docker ce 1-1:卸载旧版本的docker sudo apt-get remove ...

  8. Unity C# Scoket Thread

    关于 Scoket和Thread 也没什么要说的,网上有很多资料.但是需要注意的是 Scoket和Thread 都需要创建和杀死.不然一定会造成程序假死.好了上代码 服务器: using System ...

  9. 使用python3编写程序,生成10个随机数,每个元素的值介于1到100之间,并计算所有元素的和、平均值。

    代码如下: import random n = 0 sum = 0 while n < 10: num = random.randint(1, 100) sum = sum + num n += ...

  10. Fortify Audit Workbench 笔记 Cross-Site Scripting-Persistent

    Cross-Site Scripting: Persistent Abstract 向 Web 浏览器发送非法数据会导致浏览器执行恶意代码. Explanation Cross-Site Script ...