首页 > 其他 > 详细

Trie

时间:2020-01-22 20:17:10      阅读:73      评论:0      收藏:0      [点我收藏+]

字典树就是把所有单词插入一颗搜索树里。这样可以在线性时间内完成查找和维护信息。

应用有,于是他错误的点名开始了补退选

\(code\)

void insert(char *str)
{
    int len=strlen(str),cur=1;
    for(int i=0;i<len;++i)
    {
        int ch=str[i]-'a';
        if(!trie[cur][ch])
            trie[cur][ch]=++tot;
        cur=trie[cur][ch];
    }
}
int search(char *str)
{
    int len=strlen(str),cur=1;
    for(int i=0;i<len;++i)
    {
        int ch=str[i]-'a';
        cur=trie[cur][ch];
    }
    return ......//一般都有附加信息
}

\(01Tire\)

\(code\)

void insert(int x)
{
    int p=0;
    for(int i=30;i>=0;--i)
    {
        int ch=(x>>i)&1;
        if(!trie[p][ch]) 
            trie[p][ch]=++tot;
        p=trie[p][ch];
    }
}
int query(int x)
{
    int p=0,sum=0;
    for(int i=30;i>=0;--i)
    {
        int ch=(x>>i)&1;
        if(trie[p][!ch])
        {
            p=trie[p][!ch];
            sum+=1<<i;
        }
        else p=trie[p][ch];
    }
    return sum;
}

可持久化\(Tire\)

\(code\)

void insert(int x)
{
    int p=root[root_cnt];
    root[++root_cnt]=++tot;
    for(int i=30;i>=0;--i)
    {
        int ch=(x>>i)&1;
        siz[tot]=siz[p]+1;
        trie[tot][ch]=tot+1;
        trie[tot][!ch]=trie[p][!ch];
        p=trie[p][ch];
        tot++;
    }
    siz[tot]=siz[p]+1;
}
int query(int l,int r,int x)
{
    int ls=root[l],rs=root[r],sum=0;
    for(int i=30;i>=0;--i)
    {
        int ch=(x>>i)&1;
        if(siz[trie[rs][!ch]]-siz[trie[ls][!ch]]>0)
            ls=trie[ls][!ch],rs=trie[rs][!ch],sum|=1<<i;
        else
            ls=trie[ls][ch],rs=trie[rs][ch];
    }
    return sum;
}

Trie

原文:https://www.cnblogs.com/lhm-/p/12229437.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!