Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。
题目描述
维护一个字符串集合,支持两种操作:
I x
向集合中插入一个字符串x
;
Q x
询问字符串x
在集合中出现了多少次。
共有n
个操作,所有输入的字符串总长度不超过 105 ,字符串仅包含小写英文字母。
输入格式
第一行包含整数n
,表示操作数。
接下来n
行,每行包含一个操作指令,指令为 I x
或 Q x
中的一种。
输出格式
对于每个询问指令 Q x
,都要输出一个整数作为结果,表示x
在集合中出现的次数。
每个结果占一行。
数据范围
1≤N≤2×104
解答
#include<iostream> using namespace std;
const int MAX_NODES = 1e6 + 10;
int children[MAX_NODES][26], wordCount[MAX_NODES], nextIndex; char buffer[MAX_NODES];
void insertString(char str[]) { int node = 0; for (int i = 0; str[i]; i++) { int charIndex = str[i] - 'a'; if (!children[node][charIndex]) children[node][charIndex] = ++nextIndex; node = children[node][charIndex]; } wordCount[node]++; }
int searchString(char str[]) { int node = 0; for (int i = 0; str[i]; i++) { int charIndex = str[i] - 'a'; if (!children[node][charIndex]) return 0; node = children[node][charIndex]; } return wordCount[node]; }
int main() { int operations; cin >> operations; while (operations--) { char operationType[2]; cin >> operationType >> buffer; if (operationType[0] == 'I') insertString(buffer); else cout << searchString(buffer) << endl; } return 0; }
|
但若是只是想要AC这道题的话,使用map
可能会更简单。
代码如下
#include <iostream> #include <map> #include <string> using namespace std;
map<string, int> counter;
void insert(const string& str) { counter[str]++; }
int search(const string& str) { if (counter.find(str) != counter.end()) return counter.at(str); return 0; } int main() { int n; cin >> n; StringCounter sc; while(n--) { string op, word; cin >> op >> word; if (op == "I") { sc.insert(word); } else if (op == "Q") { cout << sc.search(word) << endl; } } return 0; }
|