trie

3 篇文章 0 订阅
2 篇文章 0 订阅

trie (字典树),用一棵树保存多个字符串,如图:

trie

这棵字典树就保存着 8 条字符串:{to,tea,ted,a,i,in,inn}。

从根节点到某特定节点的路径就是对应的字符串。如上图节点编号为红色的点就说明:从根节点到该节点的路径为一个保存了的字符串。

具体实现用trie[i][j]表示节点 i j字母到达的点的编号(根的编号为0),如上图:

trie[0][t]=1,trie[1][o]=2,trie[1][e]=3,trie[3][a]=4,...,trie[9][n]=10

字母一般用编号 0 m代替。

然后用一个val数组保存以该点为结尾的字符串的个数,如上图: val[0]=0,val[1]=0,val[2]=1,val[3]=0,...,val[10]=1

有时候可能会有多个相同字符串,所以 val 数组保存的数可能大于零。

trie 程序如下:

void buildtrie(int x)
{
    int u=0,m=strlen(str[x]);
    for(int i=0;i<m;i++)
    {
        int v=T(str[x][i]);
        if(trie[u][v]==0)                          //开新节点
        {
            trie[u][v]=++se;
            val[se]=0;
            memset(trie[se],0,sizeof(trie[se]));
        }
        u=trie[u][v];                              //接着往下走
    }
    val[u]++;
}
int main()
{
    scanf("%d",n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",str[i]);
        buildtrie(i);
    }
    return 0;
}

例题:UVALive3942(题解

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值