• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
L&King
有何不可!
   首页    新随笔    联系   管理    订阅  订阅

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+++\n",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 } 

 

posted @ 2016-04-26 15:57  L&King  阅读(213)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3