hdu-1671 Phone List

来源:互联网 发布:c界面编程怎么写 编辑:程序博客网 时间:2024/04/30 07:42

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

判断是否有字符串是另一个字符串的前缀。

//题意是判断一个号码是否是另一个号码的前缀,主要思想没变,记录每一个节点的出现次数,然后//枚举每一个单词,看是否最后一个字母出现过两次,是的话即为另一个单词的后缀。#include<cstdio>#include<cstring>#include<malloc.h>typedef struct node{    int count;    struct node *next[10];}*tree;void insert(tree h,char *s){    tree p=h;    int len=strlen(s),i;    for(i=0;i<len;i++)    {        int index=s[i]-'0';        if(p->next[index]!=NULL)        {            p=p->next[index];            p->count++;        }        else        {            tree tem=(tree)calloc(1,sizeof(node));            tem->count=1;            p->next[index]=tem;            p=tem;        }    }}int find(tree h,char *s){    tree p=h;    int len=strlen(s),i;    for(i=0;i<len;i++)    {        int index=s[i]-'0';        if(p->next[index]!=NULL)            p=p->next[index];        else return 0;    }    return p->count;}void delet(tree head)//注意这里,让我错了多次{    int i;    for(i=0;i<10;i++)    {        if(head->next[i]!=NULL)            delet(head->next[i]);    }    free(head);}char s[10001][11];int main(){    //freopen("a.txt","r",stdin);    int t,n,i,flag;    scanf("%d",&t);    while(t--)    {    tree head=(tree)calloc(1,sizeof(node));    head->count=0;    flag=0;    scanf("%d",&n);    for(i=0;i<n;i++)    {        scanf("%s",s[i]);        insert(head,s[i]);    }    for(i=0;i<n;i++)    {        if(find(head,s[i])>1) {flag=1;break;}    }    if(flag)printf("NO\n");    else printf("YES\n");    delet(head);    }    return 0;}


 

0 0
原创粉丝点击