字典树 trie

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sdz20172133/article/details/84202331

具体原理:刘汝佳《算法竞赛入门经典训练指南》P208

作用:字典树又叫单词查找树(Trie)或前缀树,是一个实现字符串。你可以在O(m)(m为所给单词的长度)时间内判断出该单词是否属于字典

代码模板:
 

struct Trie
{
    int ch[maxnode][sigma_size];//ch[i][j]==k表示第i个节点的第j个儿子是节点k
    int val[maxnode];//val[i]==x表示第i个节点的权值为x
    int sz;//字典树一共有sz个节点,从0到sz-1标号
 
    //初始化
    void clear()
    {
        sz=1;
        memset(ch[0],0,sizeof(ch[0]));//ch值为0表示没有儿子
    }
 
    //在字典树中插入单词s,但是如果已经存在s单词会重复插入且覆盖权值
    //所以insert前需要判断一下是否已经存在s单词了
    void insert(string s)
    { 
		int u=0,n=s.length();
        for(int i=0;i<n;i++)///建立字典树
        {
            int id=s[i]-'a';
            if(ch[u][id]==0)//无该儿子
            {
                ch[u][id]=sz;
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz++]=0;
            }
            u=ch[u][id];
        }
        val[u]=n;
    }
 
    //在字典树中查找单词s
    bool find(string s)
    {
        int n=s.length(),u=0;
        for(int i=0;i<n;i++)
        {
            int id=s[i]-'a';
            if(ch[u][id]==0)
                return false;
            u=ch[u][id];
     
        }
        return val[u];
    }
};
Trie trie;

经典例题: 

HDU 1251 统计难题                    字典树简单应用(找出所有以字符串s为前缀的单词个数)

Uva1401 Remember the Word    字典树简单应用(求一个字符串能有多少种方式通过字典中的单词构成)

HDU 1671 Phone List                   字典树 (多种做法:问你字典中是否有一个字符串是其他字符串的前缀)

HDU 1247 Hat’s Words(              字典树Trie):单词匹配

异或(两题一样,推荐第二道)

CH 1602 The XOR Largest Pair 字典树+异或

NBUT-1597  Find MaxXorSum     经典字典树求异或最大值(数据量大)

POJ 3764 The xor-longest Path    dfs+字典树求最大异或

猜你喜欢

转载自blog.csdn.net/sdz20172133/article/details/84202331