HDU1671 字典树

来源:互联网 发布:北京云杉网络 编辑:程序博客网 时间:2024/05/16 15:30

题目链接: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;}


0 0
原创粉丝点击