字典树
https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html
这个博客最后还有几道 字典树的模板题
这是一道 对于每个提问,给出以该字符串为前缀的单词的数量
#include <iostream> #include <stdio.h> using namespace std; int trie[1000010][26]; //数组形式定义字典树,值存储的是下一个字符的位置 int num[1000010]={0}; //附加值,以某一字符串为前缀的单词的数量 int pos = 1; void Insert(char word[]) //在字典树中插入某个单词 { int i; int rt = 0; for(i=0;word[i];i++){ int k = word[i]-'a'; if(trie[rt][k]==0) //如果对应字符还没有值 trie[rt][k] = pos++; rt = trie[rt][k]; num[rt]++;//s[i]的每个字母在树中 被经过 的次数 } } int Find(char word[]) //返回以某个字符串为前缀的单词的数量 { int i; int rt = 0; for(i=0;word[i];i++){ int k = word[i]-'a'; if(trie[rt][k]==0) return 0; rt = trie[rt][k]; } return num[rt]; //如果能到达这个rt,就输出 经过rt的次数,这样能保证是别的字符串的前缀或者相同 } int main() { char word[11]; while(gets(word)){ if(word[0]==NULL) //空行。gets读入的回车符会自动转换为NULL。 break; Insert(word); } while(gets(word)) printf("%d\n",Find(word)); return 0; }