trie

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(題解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章