AcWing 835. Trie字符串统计

地址 https://www.acwing.com/problem/content/description/837/

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

“I x”向集合中插入一个字符串x;
“Q x”询问一个字符串在集合中出现了多少次。
共有N个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。

输入格式
第一行包含整数N,表示操作数。

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

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

每个结果占一行。

数据范围
1≤N≤2∗104

复制代码
输入样例:
5
I abc
Q abc
Q ab
I ab
Q ab
输出样例:
1
0
1
复制代码

算法1
根据trie树的意义 自己设计了一个结构体
每个节点额外增加一个当前字母是不是某一个字符串的结尾 另外根据本题题意又增加了一个元素,记录到此节点的字符串被insert了几次(也就是本题的答案)

复制代码
 1 #include <iostream>
 2 #include <vector>
 3 #include <string>
 4 
 5 
 6 using namespace std;
 7 
 8 /*
 9 5
10 I abc
11 Q abc
12 Q ab
13 I ab
14 Q ab
15 */
16 /*
17 1
18 0
19 1
20 */
21 
22 struct Node {
23     vector<struct Node*> next;
24     int isEnd;
25     int count;
26     Node() {
27         next = vector<struct Node*>(26, NULL);
28         isEnd = 0;
29         count = 0;
30     }
31 };
32 
33 struct Node root;
34 
35 void Insert(string& s)
36 {
37     struct Node* p = &root;
38     for (int i = 0; i < s.size(); i++) {
39         char c = s[i];
40         int idx = c - 'a';
41         if (p->next[idx] == NULL) {
42             struct Node* pp = new Node();
43             pp->count++;
44             p->next[idx] = pp;
45             p = pp;
46         }
47         else {
48             p = p->next[idx];
49             p->count++;
50         }
51     }
52     p->isEnd = 1;
53 }
54 
55 
56 void Query(string& s)
57 {
58     struct Node* p = &root;
59     for (int i = 0; i < s.size(); i++) {
60         char c = s[i]; int idx = c - 'a';
61         if (p->next[idx] == NULL) {
62             cout << 0 << endl; return;
63         }
64         else {
65             p = p->next[idx];
66         }
67     }
68 
69     if (p->isEnd == 1)
70         cout << p->count << endl;
71 
72     return;
73 }
74 
75 int main()
76 {
77     int n;
78     cin >> n;
79     while (n--) {
80         string s;
81         char QI;
82         cin >> QI >> s;
83 
84         if (QI == 'I') {
85             Insert(s);
86         }
87         else {
88             Query(s);
89         }
90     }
91 
92     return 0;
93 }
View Code
复制代码

 

posted on   itdef  阅读(245)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
历史上的今天:
2016-11-29 状态机学习(二)解析INI文件
2015-11-29 多线程安全单例模式学习代码 c++11

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示