POJ2001 字典樹

題目鏈接:http://poj.org/problem?id=2001

大致題意:給出若干行單詞,最後給每個單詞求出最短的且唯一的前綴。其中,單詞本身作爲前綴的,它的最短獨立前綴爲自己本身。

思路:字典樹模板題,字典樹節點元素中存儲以從根節點到該節點處的串爲前綴的字符串的數量,然後查找的時候查找到前綴爲1或者查完單詞的時候所查詢到的串即爲該單詞所求的最短獨立前綴。


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

struct Trie
{
    Trie *nxt[27];
    int info;
    void init()
    {
        for (int i=0;i<26;i++) nxt[i] = NULL;
        info = 1;
    }
};

char str[1005][25];
char ans[25];

void ist(Trie *root, char *s)
{
    Trie *p,*q;
    p = root;
    int len = strlen(s);
    for (int i=0;i<len;i++)
    {
        int id = s[i] - 'a';
        if (p->nxt[id]==NULL)
        {
            q = new Trie;
            q->init();
            p->nxt[id] = q;
        }
        else
        {
            p->nxt[id]->info++;
        }
        p = p->nxt[id];
    }
}

void Search(Trie *root, char *s)
{
    int pos = 0;
    int len = strlen(s);
    Trie *p = root;
    for (int i=0;i<len;i++)
    {
        int id = s[i] - 'a';
        ans[pos++] = s[i];
        if (p->nxt[id]->info==1)
        {
            ans[pos] = '\0';
            return ;
        }
        p = p->nxt[id];
    }
    ans[pos] = '\0';
    return ;
}



int main()
{
    int cnt = 0;
    Trie *root = new Trie;
    root->init();
    while (scanf("%s",str[cnt++])==1)
    {
        ist(root,str[cnt-1]);
    }
    for (int i=0;i<cnt;i++)
    {
        Search(root,str[i]);
        printf("%s %s\n",str[i],ans);
    }
    return 0;
}


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