首页 > 代码库 > HDU1251统计难题---Trie Tree
HDU1251统计难题---Trie Tree
map巧过
#include <stdio.h> #include <string.h> #include <map> #include <string> using namespace std; map<string,int>m1; int main() { char z[10]; while(gets(z)) { if(strlen(z)==0) break; for(int i=strlen(z);i>0;i--) { z[i]=‘\0‘; m1[z]++; } } while(gets(z)) { printf("%d\n",m1[z]); } return 0; }
经典字典树(前缀树)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; struct node { int Count;///以此节点为前缀的单词数 node *next[26];///26叉树 node() ///初始化数据 { for (int i=0;i<26;i++) next[i]=NULL; Count=0; } }; node *p,*root=new node(); void Insert(char *s)///插入新单词,即建立字典树 { int i,k; p=root; for (i=0; s[i]!=‘\0‘; i++) { k=s[i]-‘a‘; if (p->next[k]==NULL) p->next[k]=new node(); ///判断是不是新节点,如果是分配创建一个新节点来存贮 , ///即root的next域对应的k位置是否为空 p=p->next[k];///向前走一步 p->Count++; ///以此位置为前缀的数量+1 } } int Search(char *s) { int i,k; p=root; for (i=0; s[i]!=‘\0‘; i++) { k=s[i]-‘a‘; if (p->next[k]==NULL)///一旦查找不到,立即跳出 return 0; p=p->next[k]; } return p->Count; } int main() { char s[11]; while (gets(s)) { int len=strlen(s); if (len==0) break; Insert(s); } while (gets(s)) { printf("%d\n",Search(s)); } return 0; }
第一个字典树(G++内存超限),第二个map(红黑树),对于此类问题,字典树效率优势明显
HDU1251统计难题---Trie Tree
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。