字典树
百度百科:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统
用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的
字符都不相同。
其基本操作有:查找、插入和删除,当然删除操作比较少见。
1.1 定义 动态申请内存
struct node //这个看起来很强嘛。。。。。。虽然我没看懂 就是绑定的
{
int cnt;
struct node *next[26]; //26指小写字母,视情况而变
node()
{
cnt = 0;
memset(next,0,sizeof(next));
}
};
1.2 定义 静态申请内存
struct node
{
int cnt;
struct node *next[10];
void init()
{
cnt = 0;
memset(next,0,sizeof(next));
}
}Heap[100005];
inline node* new_node()
{
Heap[cnt_node].init();
return &Heap[cnt_node++];
}
node *root = NULL;
2 建树
void buildtrie(char *s)
{
node *p = root;
node *tmp = NULL;
int l = strlen(s);
for(int i = 0; i < l; i++)
{
if(p->next[s[i]-'a'] == NULL)
{
tmp = new node;
p->next[s[i]-'a'] = tmp;
}
p = p->next[s[i]-'a'];
p->cnt++; // 统计数量
}
}
void findtrie(char *s)
{
node *p = root;
int l = strlen(s);
for(int i = 0; i < l; i++)
{
if(p->next[s[i]-'a'] == NULL)
{
printf("0\n");
return;
}
p = p->next[s[i]-'a'];
}
printf("%d\n",p->cnt);
}
经典例题
hdu 1251 统计难题 模板题
POJ 2001 Shortest Prefixes 给你一定数量的串,然后让你求出能分辨每一个串的最小前缀。
用字典树存储每一个串,并作标记,直到找到一个标记 为1的字母,输出即可
POJ 2418 Hardwood Species 按字典序输出,每种树占所有树的百分比
首先用字典树存所有树,再用dfs进行搜索
POJ 2503 Babelfish 简单的一一映射关系
另:不要用G++交。。。。。。会Memory Limit Exceeded。。。。。。