Trie树模板
来源:互联网 发布:软件项目成果总结报告 编辑:程序博客网 时间:2024/06/05 14:41
百度资料一大堆,编码过程中要注意这几个数组维护(貌似ACM中树都是用数组——线段树,脸是前向星实现的)
int sz;//节点编号,累加量 int ch[Word_Len][sigma_size];//Trie树 int Have_Word[Word_Len];//该节点下的单词个数 int val[Word_Len];//路径长度 int pre[Word_Len];//表示这个节点的前驱 char he[Word_Len];//表示这个节点是哪个词
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define mem(a) memset(a,0,sizeof(a))#define inf 0x3f3f3f3f#define maxn 100+10000#define sigma_size 95#define Word_Len 50500struct Tire{ int sz;//节点编号 int ch[Word_Len][sigma_size];//Trie树 int Have_Word[Word_Len];//该节点下的单词个数 int val[Word_Len];//路径长度 int pre[Word_Len];//表示这个节点的前驱 char he[Word_Len];//表示这个节点是哪个词 int NewNode(){ memset(ch[sz],0,sizeof(ch[sz])); val[sz]=Have_Word[sz]=0; return sz++; } void init(){ sz=1; NewNode(); }// 给根节点一个位置 int idx(int x){return x-32;} int insert(char *s) { int u=0; for(int i=0;s[i];i++) { int c=idx(s[i]); if(!ch[u][c])//节点不存在,新建节点 { ch[u][c]=NewNode(); he[sz-1]=s[i]; val[sz-1]=val[u]+1; pre[sz-1]=u; } u=ch[u][c];
<span style="white-space:pre"></span> Have_word[u]++;//这句的先后顺序也很重要。记录以这个点为根的串有几个 } return u; } int find_word(char *s) { int u=0; for(int i=0;s[i];i++) { int c=idx(s[i]); if(!ch[u][c]) return 0; u=ch[u][c]; } return Have_Word[u]; } void have_name(char *s,int now) { int len=val[now],cc=now; s[len--]=0; while(cc) { s[len--]=he[cc]; cc=pre[cc]; } }}ac;
POJ 2001、
#include<iostream>#include<stdio.h>#include<string>#include<string.h>#include<algorithm>#include<set>#include <cstdio>#include <cstring>#include <iostream>#include <math.h>#include <queue>#define ll intusing namespace std;inline ll Min(ll a,ll b){return a>b?b:a;}inline ll Max(ll a,ll b){return a>b?a:b;}#define Word_Len 10000#define Sigma_size 30int ch[Word_Len][Sigma_size]; //Word_Len是字典树的节点数 若都是小写字母Sigma_size=26int Have_word[Word_Len]; //这个节点下有几个单词int val[Word_Len]; // 这个节点附带的信息,初始化为0表示这个节点不存在单词,所以节点带的信息必须!=0int sz ; //当前节点数//初始化字典树void init(){sz = 1;memset(ch[0], 0, sizeof(ch[0]));memset(val, 0, sizeof(val));memset(Have_word, 0, sizeof(Have_word));}//初始化int idx(char c){ return c-'a';} //字符串编号void Creat(char *s){int u = 0, len = strlen(s);for(int i = 0; i < len; i++){int c = idx(s[i]);if(!ch[u][c]){ //节点不存在memset(ch[sz], 0, sizeof(ch[sz]));ch[u][c] = sz++;}u = ch[u][c];//这个先后顺序也会影响结果Have_word[u]++;}}void find_ans(char *s){int u = 0, len = strlen(s);for(int i = 0; i < len; i++){int c = idx(s[i]);u = ch[u][c];printf("%c",s[i]);if(Have_word[u]==1) return ;}}char S[1002][25];int n;int main(){n=0;init();while(~scanf("%s",S[n])){Creat(S[n]);n++;}for(int i=0;i<n;i++){printf("%s ",S[i]);find_ans(S[i]);printf("\n");}return 0;}
0 0
- 【模板】Trie树模板
- trie树的模板
- trie树入门(模板)
- trie树模板
- 字典树(trie)模板
- Trie字典树【模板
- Trie树模板
- Trie树模板
- Trie树模板
- 字典树Trie 模板
- Trie树模板
- Trie树模板
- Trie - 字典树 模板
- [模板]Trie树
- Trie树模板
- Trie字典树模板
- 【NOIP模板】 trie树
- 【模板】Trie树
- effective oc笔记
- startActivityForResult 的用法
- 每天学一点设计模式-适配器模式
- GEC210编译uboot和内核源码
- Linux 容器的建立和简单管理
- Trie树模板
- JavaWeb——Day21_2
- 第十二周项目三——用递归方法求解(2)
- 第六章 预处理、const、sizeof
- 关于CentOS的开机启动
- CocoaPods安装和使用教程
- 调试代码总结
- node.js是什么
- 浅析 Linux 中的时间编程和实现原理,第 1 部分: Linux 应用层的时间编程