前缀 树

已哭瞎。 搞了2个多小时的错误居然是在  没有初始化。。。。。。。。。。。。教训:每个例子一定要考虑到初始化问题。!

每个节点存了一个数组  该数组记录的有26个大小  0-25分别表示记录表示‘a‘-‘z‘。一个节点数组的单位记录的是下一个节点的索引即第几个节点。 节点数组记录了

他的所有子节点在哪里和以及子节点的字符是什么。本节点没有记录自己的字符。

适用于 多个字符串。减少枚举量

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define maxnode 500000
#define sigma_dize 27
#define Mod 20071027
int cnt;
char str[300005],word[105];
int num[300005];
struct Trie
{
    int ch[maxnode][sigma_dize];
    int val[maxnode];
    int size;
    void Init()
    {
        size=1;memset(ch[0],0,sizeof(ch[0]));
    }

    int idx(char c)
    {
        return c-‘a‘;
    }

    void insert(char *s,int v)
    {
        int u=0;
        int len=strlen(s);
        for(int i=0;i<len;i++)
        {
            int c=idx(s[i]);
            if(!ch[u][c])
            {
                memset(ch[size],0,sizeof(ch[size]));
                val[size]=0;
                ch[u][c]=size++;
            }
            u=ch[u][c];
        }
        val[u]=v;
    }
    void  search(char * s,int start)
    {
        int u=0;num[start]=0;
        int len=strlen(s);
        for(int i=start;i<len;i++)
        {
            int c=idx(s[i]);
            if(ch[u][c]==0) return;
            u=ch[u][c];
            if(val[u]) num[start]=(num[i+1]+num[start])%Mod;

        }
    }
};

Trie curTire;
int main(void)
{
    int s,h=1;
    while(scanf("%s",str)!=EOF)
    {
        curTire.Init();
        cin>>s;
        while(s--)
        {
            scanf("%s",word);
            curTire.insert(word,1);
        }

        int len=strlen(str);
        memset(num,0,sizeof(num));
        num[len]=1;
        cnt=0;
        for(int i=len-1;i>=0;i--)
            curTire.search(str,i);
        printf("Case %d: %d\n",h++, num[0]);
    }
    return 0;
}
时间: 2024-10-10 08:50:05

前缀 树的相关文章

HDU1671——前缀树的一点感触

题目http://acm.hdu.edu.cn/showproblem.php?pid=1671 题目本身不难,一棵前缀树OK,但是前两次提交都没有成功. 第一次Memory Limit Exceeded: 前缀树是很费空间的数据结构,每个节点存放了字母(数字)个数个指针,正所谓用空间来换取时间. 我发现我忘记写析构函数了,所以测例多起来还不释放很容易超空间. 树形结构的析构也很有趣: 1 ~Node() 2 { 3 for (int i = 0; i < 10; ++i) 4 { 5 if (

UVa 11732 &quot;strcmp()&quot; Anyone? (左儿子右兄弟前缀树Trie)

题意:给定strcmp函数,输入n个字符串,让你用给定的strcmp函数判断字符比较了多少次. 析:题意不理解的可以阅读原题https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2832 字符串很多,又很长,如果按照题目的意思两两比较,肯定会TLE,所以要用前缀树(Trie)来解决,当然只是用简单的前缀树也会TLE的, 我们必须对其进行优化,看了

常用算法之Trie【字典树,前缀树】

Trie中文名又叫做字典树,前缀树等,因为其结构独有的特点,经常被用来统计,排序,和保存大量的字符串,经常见于搜索提示,输入法文字关联等,当输入一个值,可以自动搜索出可能的选择.当没有完全匹配的结果时,可以返回前缀最为相似的可能. 其实腾讯的面试题有一个:如何匹配出拼写单词的正确拼写.其实用匹配树非常合适. 基本性质: 1.根节点不含有字符,其余各节点有且只有一个字符. 2.根节点到某一节点中经过的节点存储的值连接起来就是对应的字符串. 3.每一个节点所有的子节点的值都不应该相同. 借用一下维基

·专题」 Trie(前缀树)

重新整理Trie的内容,还有一种叫做双链键树,不过到现在也不会写. Trie 可以称为字典树,也叫做前缀树,叫字典树很形象,叫前缀树可以很好的区分,因为还有一种树叫做后缀树 自己就不瞎总结了,写估计也写不好.关键是时间不允许. 参考两个blog A   B 先给一个比较标准的模板 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 5 using namespace std; 6 7 #defin

9-11-Trie树/字典树/前缀树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第9章  查找 - Trie树/字典树/前缀树(键树) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据

【暑假】[实用数据结构]前缀树 Trie

前缀树Trie Trie可理解为一个能够快速插入与查询的集合,无论是插入还是查询所需时间都为O(m) 模板如下: 1 const int maxnode = 1000+10; 2 const int sigma_size = 26; 3 4 struct Trie{ 5 int ch[maxnode][sigma_size]; 6 int val[maxnode]; 7 int sz; 8 9 void clear(){ sz=1; memset(ch[0],0,sizeof(ch[0]));

支持中文的基于词为基本粒度的前缀树(prefix trie)python实现

Trie树,也叫字典树.前缀树.可用于"predictive text"和"autocompletion".亦可用于统计词频(边插入Trie树边更新或加入词频). 在计算机科学中.trie,又称前缀树或字典树.是一种有序树,用于保存关联数组,当中的键一般是字符串.与二叉查找树不同.键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的全部子孙都有同样的前缀,也就是这个节点相应的字符串,而根节点相应空字符串. 普通情况下,不是全部的节点都有相应的值,仅仅有叶子

支持中文的基于词为基本粒度的前缀树(prefix trie)实现

Trie树,也叫字典树.前缀树.可用于”predictive text”和”autocompletion”,亦可用于统计词频(边插入Trie树边更新或添加词频). 在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串.与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定.一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串.一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相

【数据结构】前缀树/字典树/Trie

[前缀树] 用来保存一个映射(通常情况下 key 为字符串  value 为字符串所代表的信息) 例如:一个单词集合 words = {  apple, cat,  water  }   其中 key 为单词      value 代表该单词是否存在 words[ 'apple' ] = 存在     而     word[ ' abc' ] = 不存在 图示:一个保存了8个键的trie结构,"A", "to", "tea", "ted

Trie(前缀树)

1 什么是Trie Trie也叫前缀树,因为存放和查找的时候都是将关键字字符串从前到后一个字母一个字母的进行的,所以叫前缀树.根节点不存放字母,其它的每个结点都存放一个字母.如果某个结点的字母是要给关键字的最后一个字母,那么该节点还存放该路径对应的关键字的值.也就是说,整个关键字字符串存放在一条路径上.另外前缀树是有序树,每个结点的左子树存放的字母比该结点的要小,右子树存放的字母比该结点要大. 2 怎样创建一棵前缀树 可以用三个数组实现一棵前缀树,一个数组是树本身,一个是key,一个是value