原题链接

题目:

维护一个字符串集合,支持两种操作:

“I x”向集合中插入一个字符串x;

“Q x”询问一个字符串在集合中出现了多少次。

共有N个操作,输入的字符串总长度不超过 10^5,字符串仅包含小写英文字母。

输入格式

第一行包含整数N,表示操作数。

接下来N行,每行包含一个操作指令,指令为”I x”或”Q x”中的一种。

输出格式

对于每个询问指令”Q x”,都要输出一个整数作为结果,表示x在集合中出现的次数。

每个结果占一行。

数据范围

1 ≤ N ≤ 2 ∗ 10^4

输入样例:

5
I abc
Q abc
Q ab
I ab
Q ab

对于代码中一些变量和数组的分析和说明(看法)

int son[N][26];
son[N][26]这个数组表示的是,一个字符串通过26个字母组成,且长度不会超过N,所以开son数组开成[N][26]。 int cnt[N];
cnt[N]这个数组是用来记录在一个位置上被打上了多少次标记,该位置上打上的标记次数等于这个字符串出现的字数。 int idx;
idx 用来记录每一个字符的所在位置,方便后面询问(Query)时查找,表示现在最新的可用的下标是多少(和单、双链表中idx的作用类似)。

两个函数的意义,表达的思想,需要注意的是,我们是怎么把Trie树的理论转换成代码实现的

void Insert(char str[]){
int p = 0; /* 0表示根节点,0同时也表示节点为空(但在p = 0这里不是代表为空的意思),每次从根节点开始寻找 */
for(int i = 0; str[i]; i++){
int u = str[i] - 'a'; /* 将字母转换成数字,方便之后存入Trie树中 */
if(!son[p][u]) son[p][u] = ++ idx; /* 如果字符串中的某一个字符在Trie树中不存在,则创建该字符的节点 */
p = son[p][u]; /* 此时的p就是str中最后一个字符对应的trie树的位置idx。 */
}
cnt[p]++; /* 在p这个位置上打上标记,每加一次说明这一个字符串出现了一次 */
} int Query(char str[]){
int p = 0;
for (int i = 0; str[i]; i++){
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
return cnt[p];
}

完整AC代码:

#include <iostream>
#include <cstdio> using namespace std; const int N = 100010; int son[N][26], cnt[N], idx; void Insert(char str[]){
int p = 0;
for(int i = 0; str[i]; i++){
int u = str[i] - 'a';
if(!son[p][u]) son[p][u] = ++ idx;
p = son[p][u];
}
cnt[p]++;
} int Query(char str[]){
int p = 0;
for (int i = 0; str[i]; i++){
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
return cnt[p];
} int main(){
int n;
scanf("%d", &n);
char op[2];
while (n--) {
char str[N];
scanf("%s%s", op, str);
if (op[0] == 'I') Insert(str);
else printf("%d\n", Query(str));
}
return 0;
}

算法基础——Trie字符串统计的更多相关文章

  1. acwing 835. Trie字符串统计

    地址  https://www.acwing.com/problem/content/description/837/ 维护一个字符串集合,支持两种操作: “I x”向集合中插入一个字符串x: “Q ...

  2. Acwing.835. Trie字符串统计(模板)

    维护一个字符串集合,支持两种操作: “I x”向集合中插入一个字符串x: “Q x”询问一个字符串在集合中出现了多少次. 共有N个操作,输入的字符串总长度不超过 105105,字符串仅包含小写英文字母 ...

  3. 【算法基础】Trie算法

    字符串统计 维护一个字符串集合,支持两种操作: “I x”向集合中插入一个字符串x: “Q x”询问一个字符串在集合中出现了多少次. 共有N个操作,输入的字符串总长度不超过 105105,字符串仅包含 ...

  4. hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)

    基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...

  5. Trie树模板1字符串统计

    Trie树模板1字符串统计 我们首先来了解一下字典树,首先看一下一张字典树的图片 字典树就是一个可以高效存储.查找字符串的树,比如上面这个字典树就是存储abc,acb,bac的字典树. 1.插入操作( ...

  6. [算法]从Trie树(字典树)谈到后缀树

    我是好文章的搬运工,原文来自博客园,博主July_,地址:http://www.cnblogs.com/v-July-v/archive/2011/10/22/2316412.html 从Trie树( ...

  7. 腾讯2017年暑期实习生编程题【算法基础-字符移位】(C++,Python)

     算法基础-字符移位 时间限制:1秒 空间限制:32768K 题目: 小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间. 你能帮帮小Q吗? ...

  8. Python基础数据类型-字符串(string)

    Python基础数据类型-字符串(string) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客使用的是Python3.6版本,以及以后分享的每一篇都是Python3.x版 ...

  9. Python之算法基础

    1>递归相关: 递归:递归算法是一种直接或间接地调用自身算法的过程,在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且                   易于 ...

随机推荐

  1. C++学习---二叉树的输入及非递归遍历

    二叉树的二叉链表存储表示如下 //二叉树的二叉链表存储表示 typedef struct BiTNode { char data;//结点数据域 struct BiTNode* lchild, * r ...

  2. LruCache缓存bitmap(一)

    Lrucache是把图片缓存到内置sd卡,设置缓存容量为系统分配容量的八分之一,单位byte,超过缓存容量gc会自动回收不长使用的缓存.觉得lrucache就先map一样,放入键值对就行了,比较方便, ...

  3. java如何实现一个Future

    实现Futrue接口 public class MsgFuture<V> implements java.util.concurrent.Future<V> { ... ... ...

  4. js逻辑程序

    JavaScript 是 Web 的编程语言. 所有现代的 HTML 页面都使用 JavaScript. JavaScript 非常容易学. 本教程将教你学习从初级到高级 JavaScript 知识. ...

  5. ArcGIS API for Javascript的Point clustering使用及默认符号无法显示问题

    1.将包含ClusterFeatureLayer.js文件的extras文件夹放在部署的arcgis api目录下,如下图. extras路径 2.使用ClusterFeatureLayer关键代码如 ...

  6. 【转】Setting up SDL Extension Libraries on MinGW

    FROM:http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/windows ...

  7. Vulnhub DC3

    靶机简介 C-3是另一个专门建造的易受攻击的实验室,目的是获得渗透测试领域的经验.与以前的DC版本一样,这个版本是为初学者设计的,尽管这次只有一个标志,一个入口点,根本没有线索.Linux技能和熟悉L ...

  8. 请介绍下你了解的ThreadLocal,它的底层原理!

    前言 业务开发中经常使用 ThreadLocal 来存储用户信息等线程私有对象... ThreadLocal 内部构造是什么样子的?为什么可以线程私有?常说的内存泄露又是怎么回事? 公众号:liuzh ...

  9. MySQL中load data infile将文件中的数据批量导入数据库

    有时候我们需要将文件中的数据直接导入到数据库中,那么我们就可以使用load data infile,下面具体介绍使用方法. dao中的方法 @Autowired private JdbcTemplat ...

  10. I am coming back

    时隔两年,我回来了,回到这个我梦开始的地方,带着一个新的身份--研究生!