trie

来源:互联网 发布:蘑菇网络词是什么意思 编辑:程序博客网 时间:2024/06/06 07:46

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

trie

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

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

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

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

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

然后用一个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(题解)

原创粉丝点击