HDU 1671 Phone List

http://acm.hdu.edu.cn/showproblem.php?pid=1671

依旧是Trie树,和上一题差不太多

View Code
#include <stdio.h>

#include <string.h> 

#include <stdlib.h> 

const int MAX=10; 

typedef struct Trie

{

    Trie *next[MAX];

    int v;

};

Trie *root;

void create(char *str)

{

    int len=strlen(str);

    Trie *p=root,*q;

    for(int i=0;i<len;i++)

    {

        int id=str[i]-'0';

        if(p->next[id]==NULL)

        { 

            q=(Trie*)malloc(sizeof(Trie));

            q->v=1;

            for(int j=0;j<MAX;j++)

                q->next[j]=NULL;

            p->next[id]=q;

            p=p->next[id]; 

        }

        else

        {

            p->next[id]->v++;

            p=p->next[id];

        } 

    }

    p->v=-1; 

} 

int find(char *str)

{ 

    int len=strlen(str);

    Trie *p=root; 

    for(int i=0;i<len;i++)

    {

        int id=str[i]-'0';

        p=p->next[id];

        if(p==NULL)return 0;

        if(p->v==-1)return -1; 

    }

    return -1;

} 

int del(Trie*T)

{

    if(T==NULL)return 0;

    for(int i=0;i<MAX;i++)

        if(T->next[i]!=NULL)

            del(T->next[i]);

    free(T); 

    return 0;

} 

int main()

{

    char str[20];

    int t,n,i;

    scanf("%d",&t);

    while(t--)

    { 

        int flag=0; 

        root=(Trie*)malloc(sizeof(Trie)); 

        for(i=0;i<MAX;i++)

            root->next[i]=NULL;

        scanf("%d",&n);

        for(i=0;i<n;i++)

        {

            scanf("%s",str);

            if(flag)continue;

            if(find(str)==-1)flag=1;

            create(str);

        } 

        if(flag)puts("NO");

        else puts("YES"); 

        del(root); 

    } 

    return 0;

} 

 

你可能感兴趣的:(list)