hdu 1671 Phone List (字典树)

来源:互联网 发布:厦门seo技术 编辑:程序博客网 时间:2024/06/06 19:23

先按长度从大到小排序。

然后判断短的是不是长的的前缀就好。


注意要回收内存


第二篇为静态分配内存。。

#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;struct node{    struct node *br[10];    int num;};node *root;void Trie_init(){    root=new node;    root->num=0;    for(int i=0;i<10;i++)root->br[i]=NULL;}void Trie_insert(char str[]){    int len=strlen(str);    node *s=root;    for(int i=0;i<len;i++)    {        int id=str[i]-'0';        if(s->br[id]==NULL)        {            node *t=new node;            for(int j=0;j<10;j++)t->br[j]=NULL;            t->num=0;            s->br[id]=t;        }        s=s->br[id];        s->num++;    }}int Trie_find(char str[]){    int len=strlen(str);    node *s;    s=root;    int res;    for(int i=0;i<len;i++)    {        int id=str[i]-'0';        if(s->br[id]==NULL)return 0;        else        {            s=s->br[id];            res=s->num;        }    }    return res;}void Trie_del(node *p){    for(int i=0;i<10;i++)    {        if(p->br[i]!=NULL)          Trie_del(p->br[i]);    }    free(p);}struct t{    char str[12];    int len;    bool operator < (const t &cmp)const    {        return len>cmp.len;    }}save[10005];int main(){    int T;    scanf("%d",&T);    while(T--)    {        Trie_init();        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%s",save[i].str);            save[i].len=strlen(save[i].str);        }        sort(save+1,save+1+n);        bool flg=true;        for(int i=1;i<=n;i++)        {            if(Trie_find(save[i].str)){flg=false;break;}            else Trie_insert(save[i].str);        }        if(flg)printf("YES\n");        else printf("NO\n");        Trie_del(root);    }    return 0;}


#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;struct node{    struct node *br[10];    int num;};node trid[100000];node *root;int cnt;void Trie_init(){    cnt=0;    root=new node;    root->num=0;    for(int i=0;i<10;i++)root->br[i]=NULL;}void Trie_insert(char str[]){    int len=strlen(str);    node *s=root;    for(int i=0;i<len;i++)    {        int id=str[i]-'0';        if(s->br[id]==NULL)        {            node *t=&trid[cnt++];            for(int j=0;j<10;j++)t->br[j]=NULL;            t->num=0;            s->br[id]=t;        }        s=s->br[id];        s->num++;    }}int Trie_find(char str[]){    int len=strlen(str);    node *s;    s=root;    int res;    for(int i=0;i<len;i++)    {        int id=str[i]-'0';        if(s->br[id]==NULL)return 0;        else        {            s=s->br[id];            res=s->num;        }    }    return res;}struct t{    char str[12];    int len;    bool operator < (const t &cmp)const    {        return len>cmp.len;    }}save[10005];int main(){    int T;    scanf("%d",&T);    while(T--)    {        Trie_init();        int n;        scanf("%d",&n);        for(int i=1;i<=n;i++)        {            scanf("%s",save[i].str);            save[i].len=strlen(save[i].str);        }        sort(save+1,save+1+n);        bool flg=true;        for(int i=1;i<=n;i++)        {            if(Trie_find(save[i].str)){flg=false;break;}            else Trie_insert(save[i].str);        }        if(flg)printf("YES\n");        else printf("NO\n");    }    return 0;}


0 0