Sicilly 1194 Message Flood(字典树+搜索)

//搜索+字典树(Trie) //维基百科关于字典树的介绍 //Trie,又称单词查找树,是一种树形结构,是一种哈希树的变种。 //典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。 //它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 #include<cstdio> #include<cstring> using namespace std; int n,m,ans; char str[10]; struct dic_tree//构造字典树,26叉树,根结点为空 { dic_tree *node[26];//26个结点 bool terminal;//表示该结点位置是否是单词的结束位 dic_tree()//构造函数,初始化终点情况和结点 { for(int i = 0;i < 26;++i) { node[i] = NULL;//初始化空结点,node[0]表示'a'在该单词中 terminal = 0; } } }*root;//树是通过指针形式来表达的 void build(dic_tree *p,char str[],int end)//生成字典树的函数 { int ix = 0; while(ix < end)//循环直到读完单词最后一个字母 { int c = str[ix] - 'a'; if(p->node[c])//如果到node[c]连通 { p = p->node[c]; if(ix == end - 1) p->terminal = 1; ++ix; } else { p->node[c] = new dic_tree; //如果不连通,则在该结点生成一个26叉树 p = p->node[c]; if(ix == end - 1) p->terminal = 1; ++ix; } } } void search(dic_tree *p,char str[],int end) { int ix = 0; while(ix < end) { int c = str[ix] - 'a'; if(p->node[c]) { p = p->node[c]; if(ix == end - 1 && p->terminal == 1) { --ans; p->terminal = 0; return; } ++ix; } else return; } } void release(dic_tree *p)//必须递归释放结点空间 { for(int i = 0;i < 26; i++) if(p->node[i]) release(p->node[i]); delete p; } void transcase(char str[]) { for(int i = 0;i < strlen(str);++i) { if(str[i] >= 'A' && str[i] <= 'Z') str[i] = str[i] - 'A' + 'a'; } }//转化大小写 int main() { //freopen("in.txt","r",stdin); while(scanf("%d",&n)) { if(n == 0) break; scanf("%d",&m); root = new dic_tree; ans = n; for(int i = 0;i < n;++i) { scanf("%s",str); transcase(str);//转换大小写 build(root,str,strlen(str));//生成字典树 } for(int i = 0;i < m;++i) { scanf("%s",str); transcase(str);//转换大小写 search(root,str,strlen(str));//搜索字典树 } printf("%d/n",ans); release(root);//记住构造树后一定要释放结点空间,否则会内存溢出 } return 0; }  

你可能感兴趣的:(搜索引擎,tree,delete,search,Build,Terminal)