ACM_模板_字典树
2016-03-02 10:57
302 查看
字典树Trie是一门比较简单也比较好懂的算法,因为字典本身是生活中使用率较高的工具,字典的工作原理大家也都懂,其本质也就是前缀查询,对前缀查询的方法,大家很容易可以想到数据结构中的链表结构,用指针去实现一个连接作用。在这里,小编先讲解一下数的指针建立。
首先因为我们字母只有26个,每个节点的指向可以加一个26节点的指针(不考虑大小写),在每输入一个字符串的时候就建立节点。
小编先给出指针实现的字典树模板:
指针由于使用时,速度会很慢,所以我们在使用的时候有时会很可能超时(TLE),所以我们可以云耀到数组去模拟指针地址。
小编这里额给出小编的数组模拟字典树Trie模板。
首先因为我们字母只有26个,每个节点的指向可以加一个26节点的指针(不考虑大小写),在每输入一个字符串的时候就建立节点。
小编先给出指针实现的字典树模板:
#include <iostream>//指针实现 #include <cstdio> #include <cstring> using namespace std; char str[11]; struct node { node *next[26]; int cnt; node() {//构造函数,创建结点时自动执行 cnt=0; for(int i=0; i<26; i++) next[i] = NULL;//将该节点的下面的26个节点初始化为空 } }; void insert(node *p,char *str) { for(int i=0; str[i]; i++) { int t=str[i]-'a'; if(p->next[t] == NULL) p->next[t] = new node;//如果节点不存在,那么先new一个 p = p->next[t]; p->cnt++; } } int find(node *p,char *str) { for(int i=0; str[i]; i++) { int t=str[i]-'a'; p = p->next[t]; if(!p) return 0; } return p->cnt; } int main() { node *root=new node(); while(gets(str)&&strlen(str)) insert(root,str); while(gets(str)) { int ans=find(root,str); printf("%d\n",ans); } return 0; }
指针由于使用时,速度会很慢,所以我们在使用的时候有时会很可能超时(TLE),所以我们可以云耀到数组去模拟指针地址。
小编这里额给出小编的数组模拟字典树Trie模板。
#include <cstdio>//数组模拟实现 #include <cstring> #define N 5000000 int tree [26],cnt ; char str[20]; int tot; void insertTrie(char *str) { int len=strlen(str); int now=0; for(int i=0; i<len; i++) { int w=str[i]-'a'; if(tree[now][w] == 0) tree[now][w] = ++tot; now = tree[now][w]; cnt[now]++; } } int searchTrie(char *str) { int len=strlen(str); int now=0; for(int i=0; i<len; i++) { int w=str[i]-'a'; if(tree[now][w] == 0) return 0; now = tree[now][w]; } return cnt[now]; } int main() { while(gets(str)&&strcmp(str,"")!=0) insertTrie(str); while(gets(str)) printf("%d\n",searchTrie(str)); return 0; }
相关文章推荐
- 关于时间交叉判断
- Scaner的输入判断
- 移动开发平台 apicloud、wex5
- NET Web的身份认证
- zookeeper系列之通信模型(转)
- poj Necklace of Beads 1286 (polya定理)置换群
- Dagger 2 项目配置错误: error: the import javax.annotation.Generated cannot be resolved
- 计算机网络的各个分层
- string、long、bigdecimal
- WEB网站常见受攻击方式及解决办法
- iOS开发——网络编程OC篇&Socket编程
- Android事件分发详细介绍
- Html 特殊符号
- 在多线程环境中使用Jedis
- 软件工程--第一天
- 根据终端分配不同的url地址
- Android CountDownTimer的使用
- [PCL]4 PCL中图像匹配的几个类图
- Zookeeper全解析——Client端(转)
- 调幅窄带信号经过滤波器的响应