poj 2001 Trie树 模板题
来源:互联网 发布:vb墨镜价格 编辑:程序博客网 时间:2024/05/02 02:29
Trie树,也叫字典树,可以很方便的储存很多个字符串。以小写英文单词为例,Trie树就是一颗26叉树,每一个节点保存一个英文字母。根节点什么也不保存,从根节点开始,第一层就代表单词的第一个字母,向下直到没有字母为止,就是一个单词。
poj2001 题意是给你最多1000个字符串,要你对于每一个字符串,输出它的最短的一个前缀,通过这个前缀能切仅能在1000个字符串中检索到它自己。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 50000;
const int size = 26;
int ac[maxn][size]; //存放所有节点的大数组,把所有节点存在一个数组里,有点像链式向前星。存放的值是先一个节点在这个大数组中的位置。
int num[maxn]; //有多少个单词用到了当前节点。
int top; //类比链式向前星里面的top,表示当前用过了多少节点。
int idx(char c) {return c-'a';}
void clear(){
memset(ac[0],0,sizeof(ac[0]));
top=1;
} //清空,只要把根节点清零就好了。
int New(){
memset(ac[top],0,sizeof(ac[top]));
num[top]=0;
return top++;
} //如果要用到一个新的节点用这个函数,返回值是新节点在ac数组中的位置。
void insert(char *s){
int k=0,L=strlen(s);
for(int i=0;i<L;++i){
int c=idx(s[i]);
if(!ac[k][c]){
ac[k][c]=New();
} //如果当前位置没有走到过,就在ac数组中腾一个位置给它。
k=ac[k][c]; //走向下一个节点。
num[k]++; //又有一个单词经过了当前节点。
}
} //插入一个新的单词。
void find(char *s){
int k=0,L=strlen(s);
for(int i=0;i<L;++i){
printf("%c",s[i]);
int c=idx(s[i]);
k=ac[k][c];
if(num[k]==1){
printf("\n");
return ;
}
}
printf("\n");
} //根据题意可以调整find函数,总体用法和insert函数差不多。。
char s[1005][100];
int main()
{
// freopen("data.in","r",stdin);
clear();
int k=0;
while(scanf("%s",s[k])!=EOF){
insert(s[k++]);
}
for(int i=0;i<k;++i){
printf("%s ",s[i]);
find(s[i]);
}
return 0;
}
- poj 2001 Trie树 模板题
- 【Trie树】模板题-POJ-2001
- POJ 3630 Trie模板题
- POJ 3630 trie树模板
- POJ 1204 Word Puzzles [ Trie树 模板题]
- poj 2503 Trie模板
- POJ 2001 Trie树
- poj 2001 trie 树
- poj 2001 Trie树
- 【模板】Trie树模板
- POJ 2001 Trie 字典树
- POJ 2001 trie字典树
- hihocoder_1014: Trie树(Trie树模板题)
- POJ2001 - 字典树(trie)的模板题
- hdu1251 字典树trie 模板题
- trie树的模板
- trie树入门(模板)
- trie树模板
- maven实战(5)-- settings.xml的配置
- i2c_client,i2c_adapter和I2C-core的简介
- 【娱见】乐视开始折腾路由器,小米与极路由还会好过吗?
- C/C++简单知识点
- Rescue The Princess (数学水题)
- poj 2001 Trie树 模板题
- 青春,应当怎样度过?
- 从零开始学习OpenGL ES之六 – 纹理及纹理映射
- java 读取项目中的配置文件
- 一款免费的网页嵌入式播放器
- maven实战(6)-- pom.xml的编写
- 母牛的故事(杭电2018)
- sql计算节假日期
- 读取xls,属性算法