zoukankan      html  css  js  c++  java
  • HDU1671Phone List (trie树)

    ---恢复内容开始---

         trie树,我是设置了号码结束标志,在insert函数里做处理:如果在插入的过程中,一直没有开辟新的节点,说明新插入的这个号码是某个已经插入了的号码的前缀,输出“NO”。如果在插入的过程中,经过了结束标志,说明这个新插入的号码之前已经插入了前缀号码,同样的,输出“NO”。此外,都输出“YES”。

     1 #include<stdio.h>
     2 #include<malloc.h>
     3 #include<string.h>
     4 typedef struct tnode
     5 {
     6     int mark;
     7     tnode *next[10];
     8 }tnode;
     9 tnode *root;
    10 void init()
    11 {
    12     int i;
    13     root=(tnode*)malloc(sizeof(tnode));
    14     for(i=0;i<10;i++)
    15         root->next[i]=NULL;
    16   root->mark=0;
    17 
    18 }
    19 int  insert(char *str)
    20 {
    21     tnode *r=root,*child;
    22     int i,flag=0;
    23     while(*str!='\0')
    24     {
    25         if(r->next[*str-'0']==NULL)
    26         {   flag=1;
    27             child=(tnode*)malloc(sizeof(tnode));
    28             for(i=0;i<10;i++)
    29                 child->next[i]=NULL;
    30             child->mark=0;
    31             r->next[*str-'0']=child;
    32 
    33 
    34         }
    35         if(r->next[*str-'0']->mark==1){flag=0;break;}
    36         r=r->next[*str-'0'];
    37         str++;
    38 
    39     }
    40     r->mark=1;
    41     if(!flag) return 1;
    42     else return 0;
    43 }
    44 void del(tnode *r)
    45 {
    46     for(int i=0;i<10;i++)
    47     {
    48         if(r->next[i]!=NULL)
    49         del(r->next[i]);
    50     }
    51     free(r);
    52 }
    53 
    54 int search(char *str)
    55 {
    56     tnode *r=root;
    57     int i=0,len,j;
    58     len=strlen(str);
    59     for(j=0;j<len-1;j++)
    60     {
    61         r=r->next[str[i]-'0'];
    62     }
    63     for(i=0;i<10;i++)
    64         if(r->next[i]!=NULL)
    65             return 1;
    66         return 0;
    67 }
    68 int main()
    69 {
    70     int T,n,i,flag,mark;
    71     char num[10005][20],ch;
    72     scanf("%d",&T);
    73     while(T--)
    74     {
    75         scanf("%d",&n);
    76         ch=getchar();
    77         init();
    78         gets(num[0]);
    79         flag=insert(num[0]);
    80         mark=0;
    81         for(i=1;i<n;i++)
    82         {
    83             gets(num[i]);
    84             flag=insert(num[i]);
    85             if(flag)mark=1;;
    86         }
    87     
    88         
    89    if(mark)printf("NO\n");
    90 
    91     else printf("YES\n");
    92         del(root);
    93 
    94     }
    95 
    96     return 0;
    97 }

    ---恢复内容结束---

  • 相关阅读:
    Dos命令%date:~0,10%
    SharePoint显示错误信息
    VM打开虚拟机文件报错
    Sharepoint2013切换用户菜单
    批量创建域用户
    通过数据库恢复SharePoint网站
    SharePoint2013修复报错
    js 循环
    js 正则表达式
    阶乘函数
  • 原文地址:https://www.cnblogs.com/leeshum/p/3027112.html
Copyright © 2011-2022 走看看