HDU1671 字典樹

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1671

大致題意:T組詢問,每組給出n個號碼,如果該組中出現以其他串爲前綴的串就輸出“NO",否則輸出”YES"。

思路:字典樹模板


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


char str[10005];
int n;


struct Trie
{
    bool flag;
    Trie *nxt[10];
    void init()
    {
        for (int i=0;i<10;i++)
            this->nxt[i] = NULL;
        flag = false;
    }
};


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

bool Search(Trie *root, char *s)
{
    Trie *p;
    p = root;
    int len = strlen(s);
    for (int i=0;i<len;i++)
    {
        int id = s[i]-'0';
        if (p->nxt[id]==NULL) return false;
        p = p->nxt[id];
    }
    return true;
}

void del(Trie *root)
{
    for (int i=0;i<10;i++)
    {
        if (root->nxt[i]!=NULL) del(root->nxt[i]);
    }
    delete(root);
}

int main()
{
    int T;
    scanf("%d",&T);
    while (T--)
    {
        Trie *root = new Trie;
        root->init();
        bool flag = true;
        scanf("%d",&n);
        for (int i=0;i<n;i++)
        {
            scanf("%s",str);
            if (Search(root,str)==true) flag = false;
            if (ist(root,str)) flag = false;
        }
        if (flag) puts("YES");
        else puts("NO");
        del(root);
    }
    return 0;
}


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