zoukankan      html  css  js  c++  java
  • HDU 1671 Phone List

    一道字典树的模板题,每次插入前查询是否有该串的某个前缀子串存在,或者该串是否某个串的前缀。具体实现是在插入时串的结尾做一个标记,如果某一个串在查询的时候找到一个标记,说明存在前缀;第二种情况是这个串遍历结束后还是没有发现一个空的,也即该串是某个串的子串。最后需要注意的是动态申请空间需要及时释放空间,不然会MLE。

    AC代码

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 struct node
     5 {
     6     node *ne[10];
     7     int v;
     8 }*head;
     9 void insert(char *s)
    10 {
    11     node *p=head,*q;
    12     for(int i=0;s[i];i++)
    13     {
    14         int id=s[i]-'0';
    15         if(p->ne[id]==NULL)
    16         {
    17             q=(node*)malloc(sizeof(node));
    18             for(int j=0;j<10;j++)
    19                 q->ne[j]=NULL;
    20             q->v=1;
    21             p->ne[id]=q;
    22             p=p->ne[id];
    23         }
    24         else
    25         {
    26             p=p->ne[id];
    27         }
    28     }
    29     p->v=-1;
    30 }
    31 int Q(char *s)
    32 {
    33     node *p=head;
    34     for(int i=0;s[i];i++)
    35     {
    36         int id=s[i]-'0';
    37         p=p->ne[id];
    38         if(p==NULL)
    39             return 0;
    40         if(p->v==-1)
    41             return -1;
    42     }
    43     return -1;
    44 }
    45 void clean(node *p)
    46 {
    47     if(p==NULL)    return ;
    48     for(int i=0;i<10;i++)
    49     {
    50         if(p->ne[i]!=NULL)
    51             clean(p->ne[i]);
    52     }
    53     free(p);
    54     return ;
    55 }
    56 int main()
    57 {
    58     int t,n;
    59     char s[20];
    60     scanf("%d",&t);
    61     while(t--)
    62     {
    63         head=(node*)malloc(sizeof(node));
    64         for(int i=0;i<10;i++)
    65             head->ne[i]=NULL;
    66         scanf("%d",&n);
    67         int f=0;
    68         while(n--)
    69         {
    70             scanf("%s",s);
    71             if(Q(s)==-1){
    72                 f=1;
    73                 //printf("%s+++
    ",s);
    74             }
    75             if(f)    continue;
    76             insert(s);
    77         }
    78         if(f)    puts("NO");
    79         else    puts("YES");
    80         clean(head);
    81     }
    82     return 0;
    83 } 
  • 相关阅读:
    学生管理
    数据类型
    Linux安装、发布Django项目
    函数式编程
    学生管理系统
    mysql数据库工具类
    python操作数据库
    链接mysql建库建表
    列表元组字典集合
    内置对象相关方法
  • 原文地址:https://www.cnblogs.com/L-King/p/5435427.html
Copyright © 2011-2022 走看看