字典树的操作:
class Trie { public: int v; Trie *next[26]; Trie() { v=0; memset(next,NULL,sizeof(next)); } }; Trie *root; void Insert(char *S) { int len=strlen(S); Trie *p=root; for(int i=0;i<len;i++) { int id=S[i]-'a'; if(p->next[id]==NULL) p->next[id]=new Trie(); p=p->next[id]; } p->v++; } int Find(char *S) //如果找到S串,返回它在字典树中出现次数,否则返回0 { Trie *p=root; int len=strlen(S); for(int i=0;i<len;i++) { int id=S[i]-'a'; p=p->next[id]; if(p==NULL) return 0; } return p->v; } int Delete(Trie *T) //删除整棵字典树 { if(T==NULL) return 0; for(int i=0;i<26;i++) if(T->next[i]!=NULL) Delete(T->next[i]); delete T; return 0; } root=new Trie(); //main中的初始化
当然,删除一个单词我们只需要把它末尾的v值改为0即可。
典型题目:
HDU1004 http://acm.hdu.edu.cn/showproblem.php?pid=1004
HDU1251 http://acm.hdu.edu.cn/showproblem.php?pid=1251
HDU1671 http://acm.hdu.edu.cn/showproblem.php?pid=1671
Codeforces-12C http://codeforces.com/contest/12/problem/C
HDU2072 http://acm.hdu.edu.cn/showproblem.php?pid=2072
下面重点说说HDU2072的字典树做法:
题意:给定一串单词,统计一共有多少个不同的单词。(注意输入时单词之间可以有任意多个空格)
分析:先把每一个单词插入字典树中,结尾就v++,最后再来遍历字典树,统计有多少个v不为0即可。
int Search(Trie *T) { if(T==NULL) return 0; for(int i=0; i<26; i++) if(T->next[i]!=NULL) Search(T->next[i]); if(T->v!=0) cnt++; return 0; }