Trie的C++实现及HDU1251,hdu1671
来源:互联网 发布:黑暗之魂3武器数据库 编辑:程序博客网 时间:2024/06/14 11:14
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cstdlib>using namespace std;template<int Size>struct trie_node{ bool terminable; //表示节点为字符串的结尾 int node; //子节点的个数 trie_node *child[Size]; //儿子节点 trie_node():terminable(false), node(0){ memset(child,0,sizeof(child)); //初始化节点 }};template<int Size,typename Index>class trie{ public: //定义类名 typedef trie_node<Size> node_type; typedef trie_node<Size> *link_type; //构造函数 trie(Index i=Index()):index(i){ } //清空函数,用于析构 void clear(){ clear_node(root); for(int i=0;i<Size;i++) root.child[i]=0; } //插入 template<typename Iterator> void insert(Iterator begin,Iterator end){ link_type cur= &root;//当前插入结点为根 while(begin!=end){ if(!cur->child[index[*begin]]){//没有插入过 cur->child[index[*begin]]=new node_type; cur->node++; //插入后,父亲多了一个儿子 } cur=cur->child[index[*begin]]; //向下走 begin++; //迭代器往前走! } cur->terminable=true; } //重载c风格插入 void insert(const char * str){ insert(str,str+strlen(str)); } //查找 template <typename Iterator> bool find(Iterator begin,Iterator end){ link_type cur=&root; while(begin!=end){ if(!cur->child[index[*begin]]) //没有节点啊!!! return false; cur=cur->child[index[*begin]]; begin++; } return cur->terminable; //是否为字符串 } //重载c风格 bool find(const char *str){ return find(str,str+strlen(str)); } //删除字符串 template<typename Iterator> bool earse (Iterator begin,Iterator end){ bool result; earse_node(begin,end,root,result); return result; } //c语言风格 bool erase(char *str){ return earse(str,str+strlen(str)); } template<typename Functor> void traverse(Functor &execute =Functor()){ visit_node(root,execute); } private: //访问结点 template<typename Functor> void visit_node(node_type cur,Functor &execute){ execute(cur); for(int i=0;i<Size;i++){//dfs if(cur.child[i]==0) continue; visit_node(*cur.child[i],execute); } } //清空 void clear_node(node_type cur){ for(int i=0;i<Size;i++){ if(cur.child[i]==0)continue; //不存在 clear_node(*cur.child[i]); delete cur.childe[i]; cur.child[i]=0; if(--cur.node==0) break; //没有节点了 } } //一边搜索一边删除 template<typename Iterator> bool earse_node(Iterator begin ,Iterator end,node_type &cur,bool &result){ if(begin==end){ result=cur.terminable; cur.terminalbe=false; return cur.node==0; } //当孩子不存在,结果假,返回假 if(cur.child[index[*begin ]]==0) return !(result=false); else if(earse_node(begin+1,end,*(cur.child[index[*begin]]),result)){ delete cur.child[index[*begin]]; cur.child[index[*begin]]=0; if(--cur.node==0&&cur.terminable==false ) return true; } return false; } //根 node_type root; //字符转索引,类似hash Index index;};class IndexClass{ public: int operator[](const char key){ return key%26; //一个映射 }};int main(){ trie<26,IndexClass> t; t.insert("tree"); t.insert("tea"); t.insert("act"); t.insert("adv"); t.insert("ate"); if(t.find("tree")){ cout<<"find!"; } char str[50]; while(scanf("%s",str)!=EOF){ if(t.find(str)==1){ cout<<"find"<<endl; } } return 0;}
大部分参考http://blog.csdn.net/luxiaoxun/article/details/7937589
后来用1251裸题测试了一下。
Ac果断高兴啊!
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cstdlib>using namespace std;template<int Size>struct trie_node{ bool terminable; //表示节点为字符串的结尾 int node; //子节点的个数 trie_node *child[Size]; //儿子节点 trie_node():terminable(false), node(0){ memset(child,0,sizeof(child)); //初始化节点 }};template<int Size,typename Index>class trie{ public: //定义类名 typedef trie_node<Size> node_type; typedef trie_node<Size> *link_type; //构造函数 trie(Index i=Index()):index(i){ } //清空函数,用于析构 void clear(){ clear_node(root); for(int i=0;i<Size;i++) root.child[i]=0; } //插入 template<typename Iterator> void insert(Iterator begin,Iterator end){ link_type cur= &root;//当前插入结点为根 while(begin!=end){ if(cur->child[index[*begin]]){//插入过 cur=cur->child[index[*begin]]; ++(cur->node); }else{ cur->child[index[*begin]]=new node_type; ++(cur->child[index[*begin]]->node); cur=cur->child[index[*begin]]; } begin++; //迭代器往前走! } cur->terminable=true; } //重载c风格插入 void insert(const char * str){ insert(str,str+strlen(str)); } //查找 template <typename Iterator> bool find(Iterator begin,Iterator end){ link_type cur=&root; while(begin!=end){ if(!cur->child[index[*begin]]) //没有节点啊!!! return false; cur=cur->child[index[*begin]]; begin++; } return cur->terminable; //是否为字符串 } template <typename Iterator> int findNum(Iterator begin,Iterator end){ link_type cur=&root; while(begin!=end){ if(!cur->child[index[*begin]]) //没有节点啊!!! return 0; cur=cur->child[index[*begin]]; begin++; } return cur->node; //是否为字符串 } //重载c风格 int findNum(const char *str){ return findNum(str,str+strlen(str)); } //重载c风格 bool find(const char *str){ return find(str,str+strlen(str)); } //删除字符串 template<typename Iterator> bool earse (Iterator begin,Iterator end){ bool result; earse_node(begin,end,root,result); return result; } //c语言风格 bool erase(char *str){ return earse(str,str+strlen(str)); } template<typename Functor> void traverse(Functor &execute =Functor()){ visit_node(root,execute); } private: //访问结点 template<typename Functor> void visit_node(node_type cur,Functor &execute){ execute(cur); for(int i=0;i<Size;i++){//dfs if(cur.child[i]==0) continue; visit_node(*cur.child[i],execute); } } //清空 void clear_node(node_type cur){ for(int i=0;i<Size;i++){ if(cur.child[i]==0)continue; //不存在 clear_node(*cur.child[i]); delete cur.childe[i]; cur.child[i]=0; if(--cur.node==0) break; //没有节点了 } } //一边搜索一边删除 template<typename Iterator> bool earse_node(Iterator begin ,Iterator end,node_type &cur,bool &result){ if(begin==end){ result=cur.terminable; cur.terminalbe=false; return cur.node==0; } //当孩子不存在,结果假,返回假 if(cur.child[index[*begin ]]==0) return !(result=false); else if(earse_node(begin+1,end,*(cur.child[index[*begin]]),result)){ delete cur.child[index[*begin]]; cur.child[index[*begin]]=0; if(--cur.node==0&&cur.terminable==false ) return true; } return false; } //根 node_type root; //字符转索引,类似hash Index index;};class IndexClass{ public: int operator[](const char key){ return key%26; //一个映射 }};int main(){ trie<26,IndexClass> t; char s[11]; //freopen("in.txt","r",stdin); while(gets(s) && s[0]) { t.insert( s); } while(gets(s)) { printf("%d\n", t.findNum(s)); } return 0;}
HDU1671
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cstdlib>#include<vector>using namespace std;#define MAXN 10template<int Size>struct trie_node{ bool terminable; //表示节点为字符串的结尾 int node; //子节点的个数 trie_node *child[Size]; //儿子节点 trie_node():terminable(false), node(0) { memset(child,0,sizeof(child)); //初始化节点 }};template<int Size,typename Index>class trie{public: //定义类名 typedef trie_node<Size> node_type; typedef trie_node<Size> *link_type; //构造函数 trie(Index i=Index()):index(i) { } //清空函数,用于析构 void clear() { clear_node(root); for(int i=0; i<Size; i++) root.child[i]=0; } //插入 template<typename Iterator> void insert(Iterator begin,Iterator end) { link_type cur= &root;//当前插入结点为根 while(begin!=end) { if(cur->child[index[*begin]]) //插入过 { cur=cur->child[index[*begin]]; cur->node++; } else { cur->child[index[*begin]]=new node_type; cur->child[index[*begin]]->node++; cur=cur->child[index[*begin]]; } begin++; //迭代器往前走! } cur->terminable=true; } //重载c风格插入 void insert(const char * str) { insert(str,str+strlen(str)); } //插入与判断 template<typename Iterator> bool insert2(Iterator begin,Iterator end) { link_type cur= &root;//当前插入结点为根 bool flag=0; while(begin!=end) { if(cur->child[index[*begin]]) //插入过 { if(cur->child[index[*begin]]->terminable==true){ flag=1; } cur=cur->child[index[*begin]]; cur->node++; } else { cur->child[index[*begin]]=new node_type; cur->child[index[*begin]]->node++; cur=cur->child[index[*begin]]; } begin++; //迭代器往前走! } cur->terminable=true; return flag; } //重载c风格插入 bool insert2(const char * str) { return insert2(str,str+strlen(str)); } //查找 template <typename Iterator> bool find(Iterator begin,Iterator end) { link_type cur=&root; while(begin!=end) { if(!cur->child[index[*begin]]) //没有节点啊!!! return false; cur=cur->child[index[*begin]]; begin++; } return cur->terminable; //是否为字符串 } //重载c风格 bool find(const char *str) { return find(str,str+strlen(str)); } //查找节点数目 template <typename Iterator> int findNum(Iterator begin,Iterator end) { link_type cur=&root; while(begin!=end) { if(!cur->child[index[*begin]]) //没有节点啊!!! return 0; cur=cur->child[index[*begin]]; begin++; } return cur->node; //是否为字符串 } //重载c风格 int findNum(const char *str) { return findNum(str,str+strlen(str)); } //查找前缀 template <typename Iterator> bool findPre(Iterator begin,Iterator end) { link_type cur=&root; while(begin!=end) { if(!cur->child[index[*begin]]) //没有节点啊!!! return false; if(cur->terminable) break; cur=cur->child[index[*begin]]; begin++; } return begin!=end; //是否为字符串 } bool findPre(const char *str){ return findPre(str,str+strlen(str)); } //删除字符串 template<typename Iterator> bool earse (Iterator begin,Iterator end) { bool result; earse_node(begin,end,root,result); return result; } //c语言风格 bool erase(char *str) { return earse(str,str+strlen(str)); } template<typename Functor> void traverse(Functor &execute =Functor()) { visit_node(root,execute); }private: //访问结点 template<typename Functor> void visit_node(node_type cur,Functor &execute) { execute(cur); for(int i=0; i<Size; i++) //dfs { if(cur.child[i]==0) continue; visit_node(*cur.child[i],execute); } } //清空 void clear_node(node_type cur) { for(int i=0; i<Size; i++) { if(cur.child[i]==0)continue; //不存在 clear_node(*cur.child[i]); delete cur.child[i]; cur.child[i]=0; if(--cur.node==0) break; //没有节点了 } } //一边搜索一边删除 template<typename Iterator> bool earse_node(Iterator begin ,Iterator end,node_type &cur,bool &result) { if(begin==end) { result=cur.terminable; cur.terminalbe=false; return cur.node==0; } //当孩子不存在,结果假,返回假 if(cur.child[index[*begin ]]==0) return !(result=false); else if(earse_node(begin+1,end,*(cur.child[index[*begin]]),result)) { delete cur.child[index[*begin]]; cur.child[index[*begin]]=0; if(--cur.node==0&&cur.terminable==false ) return true; } return false; } //根 node_type root; //字符转索引,类似hash Index index;};class IndexClass{public: int operator[](const char key) { return key%MAXN; //一个映射 }};char s[10000][11];int main(){ trie<MAXN,IndexClass> t; int T,n,i; // freopen("in.txt","r",stdin); scanf("%d",&T); while(T--) { scanf("%d",&n); t.clear(); for(i=0;i<n;i++){ scanf("%s",s[i]); t.insert(s[i]); } for(i=0;i<n;i++){ if(t.findPre(s[i])){ puts("NO"); break; } } if(i==n) puts("YES"); } return 0;}
0 0
- Trie的C++实现及HDU1251,hdu1671
- 字典树入门小结及基础模板详解(HDU1251 HDU1671)
- trie树 HDU1671
- hdu1671 trie树
- hdu1671 trie树
- Phone List hdu1671 trie
- HDU1251 Trie树
- hdu1251 统计难题 (Trie)
- hdu1251 统计难题 trie
- HDU1251 trie(结构体)
- HDU1251 trie(数组)
- HDU1251(Trie树入门)
- trie树 hdu1251
- trie hdu1251 字典树
- hdu1251(trie树)
- trie模板 -hdu1251
- hdu1251 trie树
- HDU1671用指针实现的字典树
- C#获取word的页数
- QT tslib编译错误原因
- iOS中常用的四种数据持久化方法简介
- 通过DataTable获得表的主键
- AndroidManifest.xml
- Trie的C++实现及HDU1251,hdu1671
- 魂牵梦萦
- 男子沉迷网游7天饿死2岁儿
- 黑马程序员—Java基础加强(JavaBean)
- 编写可维护的javascript (Maintainable Javascript)读书笔记(一)第一部分 编程风格
- 研发大型PHP项目的方法
- c++与C不兼容之处
- shp文件批量导入SDE
- IT行业发展前景--一个“程序猿”的选择