zoukankan      html  css  js  c++  java
  • HDOJ 1671 Phone List 字典树

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

    解析:还是字典树的练习,可以利用endFlag来指示数中的节点是不是手机号的最后一位。

    如先插入911,这时第二个1的endFlag就是true,再插入911xxxxxx的时候,插完91,发现第三个1也存在并且endFlag为true,直接返回0;

    如先插入911xxxxx,后插入911,则在插911的时候,插完91之后发现第二个1这个节点也存在,但是此时i=len-1,说明911是已插入某个手机号的前缀,返回0。

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <set>
    #include <list>
    #include <cctype>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define REP(i,j,k) for(int i = j ; i < k ; ++i)
    #define MAXV (1000)
    #define INF (0x6FFFFFFF)
    using namespace std;
    typedef struct TNode
    {
        struct TNode *next[10];
        bool endFlag;//指示本位号码是否是手机号最后一位
    } TNode;
    TNode *root;
    int Insert(char *str)
    {
        int len=strlen(str);
        TNode *p=root;
        REP(i,0,len)
        {
            if(p->next[str[i]-'0']!=NULL)//如果节点存在,访问下一个节点
            {
                p=p->next[str[i]-'0'];
                if(p->endFlag||i==len-1)//如果下一个节点是之前存入的手机号的最后一位或者是要存的手机号的最后一位则返回0
                    return 0;
            }
            else
            {
                p->next[str[i]-'0']=(TNode*)malloc(sizeof(TNode));
                p=p->next[str[i]-'0'];
                REP(j,0,10)
                {
                    p->endFlag=false;
                    p->next[j]=NULL;
                }
            }
            if(i==len-1)//最后一位置为true
                p->endFlag=true;
        }
        return 1;
    }
    void fcuk(TNode *X)
    {//释放内存
        REP(i,0,10)
        {
            if(X->next[i]!=NULL)
                fcuk(X->next[i]);
        }
        free(X);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int t,n;
        char num[15];
        while(~scanf("%d",&t))
        {
            while(t--)
            {
                root=(TNode*)malloc(sizeof(TNode));
                REP(i,0,10)
                {
                    root->next[i]=NULL;
                    root->endFlag=false;
                }
                int cnt=0;
                scanf("%d",&n);
                REP(i,0,n)
                {
                    scanf("%s",num);
                    cnt+=Insert(num);
                }
                if(cnt==n)
                    printf("YES\n");
                else
                    printf("NO\n");
                fcuk(root);
            }
        }
        return 0;
    }
  • 相关阅读:
    编程语言扮演的3个角色,它连接了机器、开发者以及团队!
    20行代码爬取王者荣耀全英雄皮肤!让你享受白嫖的快乐!
    3分钟教会你如何发布Qt程序!高级编程界面开发也是如此的简单!
    C 语言实现一个简单的 web 服务器!了解 Socket 通讯工作原理!
    log4j
    解决MySQL 一闪而过的情况
    subversion和客户端的应用
    Map集合
    代码块执行顺序。
    ArrayList-VS-LinkedList
  • 原文地址:https://www.cnblogs.com/aboutblank/p/3124238.html
Copyright © 2011-2022 走看看