Trie树 poj3630

题目链接

题目描述

  有n个电话号码,长度对多为10个,问存不存在一个电话号码是另一个的前缀,是就输出NO,否则YES。

  1. n<104

  

思路

  Trie树裸题

  1. 把所有字符串插入Trie树

  2. 插入时进行以下判断:

    a. 当前插入的字符串可以沿着Tries树中的某条路径一直往下走,不用新开节点:可能比这条路径表示的字符串长,即最后才新开节点。可能比它短,即当前插入字符串读完后,Tries树的这条路径还可延伸。

    b. Trie树的这条路径没走完就新开节点,显然就不是前缀

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

int ch[100000+10][10+1];
int sz;

bool insert(char *s)
{
    bool  flag = false;
    int j,n;
    int u = 0;
    n = strlen(s);
    for(int i = 0; i<n; i++)
    {
        int c = s[i] - ‘0‘;
        if(!flag && u){
            for(j = 0; j<10; j++)
                if(ch[u][j] != -1) break;
            if(j == 10) return true;
        }
        if(ch[u][c] == -1){
            memset(ch[sz], -1, sizeof(ch[sz]));
            ch[u][c] = sz++;
            flag = true;
        }
        u = ch[u][c];
    }
    if(!flag) return true;
    return false;
}

int main()
{
    int cas;
    scanf("%d",&cas);
    while(cas--)
    {
        int n, i;
        scanf("%d",&n);
        sz = 1;
        memset(ch[0], -1, sizeof(ch[0]));
        bool flag = false;
        for(i = 0; i<n; i++){
           char s[10+5];
           scanf("%s",s);
           if(flag) continue;
           flag = insert(s);

        }
        if(!flag) printf("YES\n");
        else      printf("NO\n");
    }
    return 0;
}
时间: 2024-10-18 21:49:33

Trie树 poj3630的相关文章

poj3630 Phone List (trie树模板题)

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 26328   Accepted: 7938 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 catalogu

poj3630 Phone List【Trie树】

Phone List Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34805   Accepted: 9980 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 catalogu

跳跃表,字典树(单词查找树,Trie树),后缀树,KMP算法,AC 自动机相关算法原理详细汇总

第一部分:跳跃表 本文将总结一种数据结构:跳跃表.前半部分跳跃表性质和操作的介绍直接摘自<让算法的效率跳起来--浅谈"跳跃表"的相关操作及其应用>上海市华东师范大学第二附属中学 魏冉.之后将附上跳跃表的源代码,以及本人对其的了解.难免有错误之处,希望指正,共同进步.谢谢. 跳跃表(Skip List)是1987年才诞生的一种崭新的数据结构,它在进行查找.插入.删除等操作时的期望时间复杂度均为O(logn),有着近乎替代平衡树的本领.而且最重要的一点,就是它的编程复杂度较同类

Trie树学习2

数组实现的Trie树 字符容量有限,可以使用链表实现更为大容量的Trie #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib> #

trie树(字典树)

1. trie树,又名字典树,顾名思义,它是可以用来作字符串查找的数据结构,它的查找效率比散列表还要高. trie树的建树: 比如有字符串"ab" ,"adb","adc"   可以建立字典树如图: 树的根节点head不存储信息,它有26个next指针,分别对应着字符a,b,c等.插入字符串ab时,next['a'-'a']即next[0]为空,这是申请一个结点放在next[0]的位置,插入字符串db时,next['d'-'a']即next[3]

Trie树

Trie树,即字典树或单词查找树,主要用于大量字符串的检索.去重.排序等操作. 主要原理就是利用字符串的公共前缀建立一棵多叉树,牺牲空间换取时间. 1 //Trie树 2 #include <iostream> 3 #include <string> 4 using std::cin; 5 using std::cout; 6 using std::endl; 7 using std::string; 8 9 const int SIZE = 26; 10 const char B

bzoj4103异或运算 可持久化trie树

要去清华冬令营了,没找到2016年的题,就先坐一坐15年的. 因为n很小,就按照b串建可持久化trie树,a串暴力枚举. 其他的直接看代码. #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; inline int read() { int x=0,f=1,ch=getchar(); while(ch<'0'||ch

hihoCoder 1014 Trie树

#1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进. 这一天,他们遇到了一本词典,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能对于每一个我给出的字符串,都在这个词典里面找到以这个字符串开头的所有单词呢?” 身经百战的小Ho答道:“怎么会不能呢!你每给我一个字符串,我就依次遍历词典里的所有单词,检查你给我的字

HDU 1251 Trie树模板题

1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define max(a,b) a>b?a:b #define F(i,a,b