zoukankan      html  css  js  c++  java
  • 山东第一届省赛1001 Phone Number(字典树)

    Phone Number

     

    Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

    题目描述

    We know that if a phone number A is another phone number B’s prefix, B is not able to be called. For an example, A is 123 while B is 12345, after pressing 123, we call A, and not able to call B.
    Given N phone numbers, your task is to find whether there exits two numbers A and B that A is B’s prefix.
     

    输入

     The input consists of several test cases.
     The first line of input in each test case contains one integer N (0<N<1001), represent the number of phone numbers.
     The next line contains N integers, describing the phone numbers.
     The last case is followed by a line containing one zero.

    输出

     For each test case, if there exits a phone number that cannot be called, print “NO”, otherwise print “YES” instead.

    示例输入

    2
    012
    012345
    2
    12
    012345
    0

    示例输出

    NO
    YES

    提示

     

    来源

     2010年山东省第一届ACM大学生程序设计竞赛
    题意:给出几个字符串问是否会有前缀产生,直接字典树搞定
     1 #include <iostream>
     2 #include <algorithm>
     3 #include <cstring>
     4 #include <cstdio>
     5 using namespace std;
     6 const int Max = 1000 + 10;
     7 struct Node
     8 {
     9     int value;
    10     int cnt;
    11     Node * Next[10];
    12 };
    13 Node * root;
    14 char str[Max];
    15 bool build(char * s)
    16 {
    17     Node * p = root, *temp;
    18     int len = strlen(s);
    19     for (int i = 0; i < len; i++)
    20     {
    21         int id = str[i] - '0';
    22         if (p->Next[id] == NULL)
    23         {
    24             temp = new Node;
    25             temp->value = id;
    26             temp->cnt = 0;
    27             for (int i = 0; i < 10; i++)
    28                 temp->Next[i] = NULL;
    29             p->Next[id] = temp;
    30         }
    31         p = p->Next[id];
    32         if (p->cnt)
    33             return false;
    34     }
    35     return true;
    36 }
    37 void destroy(Node * temp)
    38 {
    39     if (temp == NULL)
    40         return;
    41     for (int i = 0; i < 10; i++)
    42         destroy(temp->Next[i]);
    43     delete temp;
    44 }
    45 int main()
    46 {
    47     int n;
    48     while (scanf("%d", &n) != EOF && n)
    49     {
    50         root = new Node;
    51         for (int i = 0; i < 10; i++)
    52             root->Next[i] = NULL;
    53         bool flag = true;
    54         while (n--)
    55         {
    56             scanf("%s", str);
    57             if (!flag)
    58                 continue;
    59             if (!build(str))
    60                 flag = false;
    61         }
    62         if (flag)
    63             printf("YES
    ");
    64         else
    65             printf("NO
    ");
    66         destroy(root);
    67     }
    68     return 0;
    69 }
    View Code
  • 相关阅读:
    clean code
    jenkins
    获取目录下的文件名称
    bootstrap-select 下拉互斥
    supervisord
    正则表达式
    Docker
    git
    goland工具
    小程序 swiper 轮播图滚动图片 + 视频
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5451252.html
Copyright © 2011-2022 走看看