本题是trie树模板题,如果不用trie而用map写可以看出trie处理这类问题有明显的时间优势。
在trie树中查找一个关键字的时间和树中包含的结点数无关,而取决于组成关键字的字符数。(对比:二叉查找树的查找时间和树中的结点数有关O(log2n)。)
如果要查找的关键字可以分解成字符序列且不是很长,利用trie树查找速度优于二叉查找树。
若关键字长度最大是5,则利用trie树,利用5次比较可以从265=11881376个可能的关键字中检索出指定的关键字。而利用二叉查找树至少要进行log2265=23.5次比较。
//125ms #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #include<stack> #include<queue> #include<cctype> #include<sstream> using namespace std; #define pii pair<int,int> #define LL long long int const int eps=1e-8; const int INF=1000000000; const int maxn=1; struct trie { trie *child[26]; int v; }; trie root; void create_trie(char *ss) { int len=strlen(ss); trie *p=&root,*q; for(int i=0;i<len;i++) { int id=ss[i]-'a'; if(p->child[id]==NULL) { q=(trie*)malloc(sizeof(trie)); q->v=1; for(int j=0;j<26;j++) { q->child[j]=NULL; } p->child[id]=q; p=p->child[id]; } else { p->child[id]->v++; p=p->child[id]; } } } int find_trie(char*ss) { int len=strlen(ss); trie *p=&root; for(int i=0;i<len;i++) { int id=ss[i]-'a'; if(p->child[id]==NULL) return 0; p=p->child[id]; } return p->v; } int main() { //freopen("in8.txt","r",stdin); char str[15]; while(gets(str)&&(str[0]!='