题意:

     给你一些模式串,然后给你一些提问,每个提问是给你一个串,问你这个串在上

面的模式串中出现的次数。


思路:

      一开始想到hash,但是因为用的是map,所以超时了,map的操作是有代价的,他本身还会排序的,所以超时了,想用vec结果还没弄出来这个类型hash["aaa"] = 1,最后只能字典树了,先想下字典树,字典树处理前缀的出现的次数的时候非常拿手的,对于这个题目,我们可以把每个串都拆开,拆成一个一个的,然后在把他们加在树里面,这样就OK了,还有一个关键的地方,就是比如拆这个串 aa 可以拆成
a ,a ,aa,所以我们要在第一个a的时候只累加一次,怎么做到呢,可以在Tree的结构体里面在开个变量,标记当前这个字母最后一次是被谁更新的,如果是自己,那么就不会V++.


#include<stdio.h>
#include<string.h>
#include<stdlib.h>

typedef struct
Tree
{

Tree *next[26];
int
v ,mk;
}
Tree; Tree root; void Buid_Tree(char *str ,int mkk)
{
int
len = strlen(str);
Tree *p = &root ,*q;
for(int
i = 0 ;i < len ;i ++)
{
int
id = str[i] - 'a';
if(
p -> next[id] == NULL)
{

q = (Tree *) malloc(sizeof(root));
q -> v = 1;
q -> mk = mkk;
for(int
j = 0 ;j < 26 ;j ++)
q -> next[j] = NULL;
p -> next[id] = q;
p = p -> next[id]; }
else
{

p = p -> next[id];
if(
p -> mk != mkk) p -> v ++;
p -> mk = mkk;
}
}
} int
Find(char *str)
{
int
len = strlen(str);
Tree *p = &root;
for(int
i = 0 ;i < len ;i ++)
{
int
id = str[i] - 'a';
p = p -> next[id];
if(
p == NULL) return 0;
}
return
p -> v;
} int main ()
{
char
str[25];
int
n ,m ,i;
while(~
scanf("%d" ,&n))
{
for(
i = 0 ;i < 26 ;i ++)
root.next[i] = NULL;
for(
i = 1 ;i <= n ;i ++)
{

scanf("%s" ,str);
int
len = strlen(str) - 1;
for(int
ii = 0 ;ii <= len ;ii ++)
{
char
now[25];
for(int
jj = 0 ;jj + ii <= len ;jj ++)
{

now[jj] = str[ii + jj];
now[jj+1] = '\0';
Buid_Tree(now ,i);
}
}
}

scanf("%d" ,&m);
for(
i = 1 ;i <= m ;i ++)
{

scanf("%s" ,str);
printf("%d\n" ,Find(str));
}
}
return
0;
}

hdu2846 字典树(带id的)的更多相关文章

  1. Codeforces 948 数论推导 融雪前缀和二分check 01字典树带删除

    A. 全部空的放狗 B. 先O(NLOGNLOGN)处理出一个合数质因数中最大的质数是多少 因为p1 x1 x2的关系是 x2是p在x1之上的最小倍数 所以x1的范围是[x2-p+1,x2-1]要使最 ...

  2. hdu2846 字典树

    给你一堆字符串,然后再给你几个查询,前面那些字符串中有多少个包含了这个串.所以可以把开始inset()的字符遍历一遍,同时可能出现该字符串在某个字符串中有多次出现,所以还要用flag标记,来区分不同的 ...

  3. hdu2846 Repository 字典树(好题)

    把每个字符串的所有子串都加入字典树,但在加入时应该注意同一个字符串的相同子串只加一次,因此可以给字典树的每个节点做个记号flag--表示最后这个前缀是属于那个字符串,如果当前加入的串与它相同,且二者属 ...

  4. CodeForeces 842d Vitya and Strange Lesson ——(带lazy标记的01字典树)

    给一个序列,每次操作对这个序列中的所有数异或一个x,问每次操作完以后整个序列的mex值. 做法是去重后构建01字典树,异或x就是对root加一个x的lazy标志,每次pushDown时如果lazy的这 ...

  5. TRIE 字典树 前缀紧急集合!

    TRIE: 在计算机科学中,Trie,又称前缀树或字典树,是一种有序树状的数据结构,用于保存关联数组,其中的键通常是字符串.——百度百科 自我理解: trie树,是一种处理字符串前缀的数据结构,通常会 ...

  6. POJ 3764 - The xor-longest Path - [DFS+字典树变形]

    题目链接:http://poj.org/problem?id=3764 Time Limit: 2000MS Memory Limit: 65536K Description In an edge-w ...

  7. HDU5589:Tree(莫队+01字典树)

    传送门 题意 略 分析 f[u]表示u到根的边的异或 树上两点之间的异或值为f[u]^f[v], 然后将查询用莫队算法分块,每个点插入到字典树中,利用字典树维护两点异或值大于等于M复杂度O(N^(3/ ...

  8. Codeforces 577E Ann and Half-Palindrome 字典树

    题目链接 题意: 若一个字符串是半回文串.则满足第一位和最后一位相等, 第三位和倒数第三位相等.如此类推. 给定一个字符串s,输出s的全部子串中的半回文串字典序第k大的 字符串. good[i][j] ...

  9. Tire树(字典树)

    from:https://www.cnblogs.com/justinh/p/7716421.html Trie,又经常叫前缀树,字典树等等.它有很多变种,如后缀树,Radix Tree/Trie,P ...

随机推荐

  1. 转: 微信已支持发送最大 200MB 的视频了,并且不会被压缩 来自腾讯微信团队的视频消息,目前 iOS 版本的微信已支持发送最大 200MB 的视频与图片了,并且不会被压缩.安卓版本未来一段时间会支 ...

  2. Docker 下Elasticsearch 的安装 和ik分词器

    (1)docker镜像下载 docker pull elasticsearch:5.6.8 (2)安装es容器 docker run -di --name=changgou_elasticsearch ...

  3. TorchVision Faster R-CNN 微调,实战 Kaggle 小麦检测

    本文将利用 TorchVision Faster R-CNN 预训练模型,于 Kaggle: 全球小麦检测 上实践迁移学习中的一种常用技术:微调(fine tuning). 本文相关的 Kaggle ...

  4. POJ-2516(最小费用最大流+MCMF算法)

    Minimum Cost POJ-2516 题意就是有n个商家,有m个供货商,然后有k种商品,题目求的是满足商家的最小花费供货方式. 对于每个种类的商品k,建立一个超级源点和一个超级汇点.每个商家和源 ...

  5. day1_安装及建立数据库和表

    #第一份数据库及表create database library; use library; create table book( id int primary key, book_name char ...

  6. [学习笔记] KM算法

    前言 这个东西学了我挺久了,我先奉劝各位一定要先搞清楚匈牙利算法.感谢 \(\tt jzm\) 巨佬对我耐心的讲解,因为我太弱了所以卡了很久都不懂.如果你有任何问题请在本篇博客下面留言,我会尽力解答的 ...

  7. [ONTAK2010] Peaks 加强版

    [ONTAK2010] Peaks 加强版 题目大意:原题变为强制在线查询 Solution 读入山高,排序后依然建立树链,初始化并查集,初始化重构树新节点标号为\(n+1\) 读入边,按照边权从小到 ...

  8. HTTP 状态码(转载)

    本文由 简悦 SimpRead 转码, 原文地址 www.cnblogs.com HTTP 状态码 (HTTP Status Code) 状态码并不是每个都有,为了后期扩展.[update201705 ...

  9. teprunner测试平台用例前置模块开发

    本文开发内容 现在正式进入测试相关功能开发.teprunner测试平台底层是pytest,中间层是tep,还没了解的朋友可以先看看tep的文章,整个平台的设计思路和后面用例的执行都会基于这个工具.te ...

  10. Java 添加数字签名到Excel以及检测、删除签名

    Excel中可添加数字签名以供文档所有者申明文档的所有权或有效性.文本以Java代码示例介绍如何在Excel文档中对数字签名功能进行相关操作,包括如何添加签名到Excel.检测Excel文档是否已签名 ...