DS哈希查找--Trie树
时间限制1s
内存限制128MB
题目描述
Trie树又称单词查找树,是一种树形结构,如下图所示。
它是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
输入的一组单词,创建Trie树。输入字符串,计算以该字符串为公共前缀的单词数。
(提示:树结点有26个指针,指向单词的下一字母结点。)
输入
测试数据有多组
每组测试数据格式为:
第一行:一行单词,单词全小写字母,且单词不会重复,单词的长度不超过10
第二行:测试公共前缀字符串数量t
后跟t行,每行一个字符串
输出
每组测试数据输出格式为:
第一行:创建的Trie树的层次遍历结果
第2~t+1行:对每行字符串,输出树中以该字符串为公共前缀的单词数。
输入样例1
abcd abd bcd efg hig
3
ab
bc
abcde
输出样例1
abcd abd bcd efg hig
3
ab
bc
abcde
测试样例2(问助教所得)
aback abash abase able ablout ablove abyss acme bed build buy by bus
5
ab
b
aba
bu
bv
输出样例2
abbceuyalymdisycseoselkehuvsdte
7
5
3
3
0
题目不难,基本思路就是按图建树(用好指针数组),建树过程记得记录访问过该节点的单词树(即代码中的siz),然后按照字符串找到节点输出siz就行了。
第一次写完提交错了,问助教,结果助教ddl太多来不及回,后面在截止时间前10分钟左右回了我。原来题意理解错了……so,审题很重要。
AC代码:
#include <iostream>
#include <string>
#include<queue>
using namespace std;
class Node {
public:
Node *next[26];
int siz = 0;
void setNull() {
for (int i = 0; i < 26; ++i) {
next[i] = nullptr;
}
}
};
void level_traverse(Node *p, queue<Node> q) {
for (int i = 0; i < 26; ++i) {
if (p->next[i]) {
}
}
}
int main() {
Node *root = new Node();
root->setNull();
string s;
do {
cin >> s;
Node *p = root;
for (int i = 0; i < s.size(); ++i) {
int index = s[i] - 'a';
if (p->next[index]) {
p = p->next[index];
p->siz++;
} else {
p->next[index] = new Node();
p = p->next[index];
p->siz++;
}
}
} while (s[0] >= 'a' && s[0] <= 'z');
queue<Node *> q;
q.push(root);
while (!q.empty()) {
Node *p = q.front();
for (int i = 0; i < 26; ++i) {
if (p->next[i]) {
cout << char(i + 'a');
q.push(p->next[i]);
}
}
q.pop();
}
cout << endl;
int t = atoi(s.c_str());
for (int i = 0; i < t; ++i) {
string str;
cin >> str;
Node *p = root;
int flag = 0;
for (int j = 0; j < str.size(); ++j) {
int index = str[j] - 'a';
if (p->next[index]) {
p = p->next[index];
} else {
cout << 0 << endl;
flag = 1;
break;
}
}
if (flag == 0) {
cout << p->siz << endl;
}
}
}