#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++){//dfsif(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;//字符转索引,类似hashIndex 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++){//dfsif(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;//字符转索引,类似hashIndex 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 10
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 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;//字符转索引,类似hashIndex 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;}

转载于:https://www.cnblogs.com/dengyaolong/p/3697197.html

Trie的C++实现及HDU1251,hdu1671相关推荐

  1. 提高篇 第二部分 字符串算法 第3章 Trie字典树

    Trie(字典树)解析及其在编程竞赛中的典型应用举例 - Reqaw - 博客园 『一本通』Trie字典树 - YeLingqi - 博客园 字典树(Trie Tree) - 仰望高端玩家的小清新 - ...

  2. HDU1251 统计难题 【trie树】

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Subm ...

  3. hdu1251(trie树)

    Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).  I ...

  4. HDU1251 统计难题 trie树 简单

    http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意: 找前缀数量 裸模板 1 #include<cstdio> 2 #include< ...

  5. 字典树 ZOJ1109 HDU1251 PKU1204 HDU1075

    又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀 ...

  6. HDU1251 统计难题【字典树】

    统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Subm ...

  7. BZOJ3166 [Heoi2013]Alo 【可持久化trie树 + 二分 + ST表】

    题目 Welcome to ALO ( Arithmetic and Logistic Online).这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题. 现在你拥有n颗宝石,每颗宝石 ...

  8. usaco Cowxor (trie 树)

    没想到trie树还可以用在这上面,厉害厉害. [分析]这是字母树的经典应用.首先因为是求xor的最大值,可以用前缀和计算xor值,然后n^2枚举即可. [cpp] view plaincopy for ...

  9. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

最新文章

  1. 史上最大“云办公”实验开始,你参加了吗?
  2. golang goland报错错误 $GOPATH/go.mod exists but should not 解决方法
  3. java8 遍历目录_使用java8API遍历过滤文件目录及子目录及隐藏文件
  4. 【矩阵】概念的理解 —— span、基
  5. sql server 2005 数据库状态 变成 可疑的解决方案
  6. 计算机系统的优化具体操作,从八个方面来探讨计算机操作系统的优化
  7. python str转int_Python入门丨数据类型与转换
  8. 145. PHP header status code
  9. python 导入excel_经理要我把五百万条数据全部导入Excel!还好有Python!不然等死...
  10. python超市管理系统总汇总功能解说_控制台超市系统(Python)
  11. VB串口通信技术资料:媒体/源码/论文/书籍/视频/控件/程序
  12. 迈高图手机版_迈高图(地图数据下载器 ) V2.10.1.0 官方版-完美软件下载
  13. C语言入门之鸡兔同笼(简易版)
  14. python股票回测_python量化入门(一)——利用特定指标筛选股票并回测
  15. 昵图网学校计算机教室制度,极域电子教室教师端使用说明-20210408211401.docx-原创力文档...
  16. 完美解决Python 发送邮件126,136,QQ等,都会报•554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件。请检查是否有用户发送病毒或者垃圾邮件
  17. uniapp遇到后台返回base64码格式图片没有显示出来
  18. 标准之争:影响 IPv6 部署的经济学因素
  19. P1036 [NOIP2002 普及组] 选数
  20. PHP大作业_课程设计_教务在线系统

热门文章

  1. python基础语法 第0关print-python学习笔记1,新手小白也能看得懂
  2. python使用方法视频-使用Python进行视频处理
  3. python 制作gif-怎样用Python制作好玩的GIF动图
  4. python四大软件-PYPL 9月编程语言排行榜发布 Python一枝独秀
  5. 数据结构 python的书推荐-java数据结构书一般推荐看什么好?
  6. python自学网课-python老男孩网课22期视频教程全
  7. python读取excel表格-Python读取Excel单元格的内容
  8. python基础教程第三版豆瓣-Python爬虫入门教程:豆瓣读书练手爬虫
  9. 写出现代计算机网络的三个方面的应用,《计算机应用基础》统考模拟试题一及参考答案0...
  10. 网络编程学习笔记(shutdown函数)