【字典树】POJ_3630_Phone List

Phone List
Time Limit: 1000MS
Memory Limit: 65536K

Description
Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone catalogue listed these numbers:
• Emergency 911
• Alice 97 625 999
• Bob 91 12 54 26
In this case, it's not possible to call Bob, because the central would direct your call to the emergency line as soon as you had dialled the first three digits of Bob's phone number. So this list would not be consistent.

Input
The first line of input gives a single integer, 1 ≤ t ≤ 40, the number of test cases. Each test case starts with n, the number of phone numbers, on a separate line, 1 ≤ n ≤ 10000. Then follows n lines with one unique phone number on each line. A phone number is a sequence of at most ten digits.

Output
For each test case, output "YES" if the list is consistent, or "NO" otherwise.

Sample Input
2
3
911
97625999
91125426
5
113
12340
123440
12345
98346

Sample Output
NO
YES

Source
Nordic 2007

题意:
给n个电话簿,每个电话簿中有m个电话号码,如果电话簿中有某一个号码是无效的(即另一个号码为其前缀),则输出NO,如果没有则输出YES。

思路:
字典树。

#include<cstdio>
#include<cstring>
using namespace std;

char phone[10 + 5];
bool yes;

int cnt;
struct Node {
    int next[10];
    int has;
}node[1000000 + 10];

void build(int root, char* str, bool hasNew) {
    int th = str[0] - '0';
    if (node[root].next[th] == 0) {
        node[root].next[th] = cnt++;
        hasNew = true;
    }
    if (node[node[root].next[th]].has == 1)
        yes = false;
    if (str[1] == '\0') {
        node[node[root].next[th]].has = 1;
        if (!hasNew)
            yes = false;
        return;
    }
    build(node[root].next[th], str + 1, hasNew);
    return;
}

int main() {
    int T, n;
    scanf("%d", &T);
    while (T--) {
        memset(node, 0, sizeof(node));
        cnt = 2;
        yes = true;
        scanf("%d", &n);
        for (int i = 0; i < n; ++i) {
            scanf("%s", phone);
            build(1, phone, false);
        }
        if (yes)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • **2014真题Directions:Read the following text. Choose the be...
    又是夜半惊坐起阅读 13,400评论 0 23
  • 传播这个谣言的人还真的不把西瓜皮放在眼里了。 所谓西瓜“打针”,就是传言中用注射器向西瓜中注射甜蜜素或色素,让西瓜...
    发现好物阅读 4,799评论 0 0
  • 胡艳2017年5月13日总结:今天周末陪小孩画画和拼图,身为小家伙妈妈的同时,更是好朋友一样玩耍尊重对方。时常也会...
    FAB至尚夏冰阅读 2,773评论 0 0
  • 正在阅读《你的生命有什么可能》 阅读有效时间:70分钟 阅读中遇到了什么困难:无 阅读收获:在单位我们经理经常跟我...
    玉华_219a阅读 1,482评论 0 0
  • 还是习惯动笔 喜欢写字 换作手机便不知道自己要说什么 或者是已经不想表达 是懒 觉得矫情 我在努力的了解自己 或许...
    我吞了一颗太阳6阅读 1,183评论 0 1