hdu1251(Trie树)

传送门:统计难题

分析:Trie树入门题,随便写写练下手感,统计每个节点被多少单词经过就可以了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#define LL long long
#define N 500010
using namespace std;

char s[15];
struct Trie
{
    int cnt[N],child[N][27];
    int L,root;
    int newnode()
    {
        memset(child[L],0,sizeof(child[L]));
        return L++;
    }
    void init()
    {
        L=0;
        memset(cnt,0,sizeof(cnt));
        root=newnode();
    }
    void insert(char *s)
    {
        int now=root;
        for(int i=0;s[i];i++)
        {
            int id=s[i]-‘a‘;
            if(!child[now][id])
                child[now][id]=newnode();
            now=child[now][id];
            cnt[now]++;
        }
    }
    int query(char *s)
    {
        int now=root;
        for(int i=0;s[i];i++)
        {
            int id=s[i]-‘a‘;
            if(!child[now][id])return 0;
            now=child[now][id];
        }
        return cnt[now];
    }
}trie;
int main()
{
    trie.init();
    while(gets(s))
    {
        if(strlen(s)==0)break;
        trie.insert(s);
    }
    while(scanf("%s",s)==1)printf("%d\n",trie.query(s));
}

时间: 2024-10-14 04:06:18

hdu1251(Trie树)的相关文章

HDU1251 统计难题 【trie树】

统计难题 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others) Total Submission(s): 17302    Accepted Submission(s): 7464 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的

Trie树+HDU1251

一.引入: 先看一道模板题:https://vjudge.net/problem/HDU-1251. 简单!把每个单词的每个前缀提取出来,开个map存一下就行了. 时间复杂度:O(n^2log(n)).T飞了QAQ. 这时Trie树就来帮忙了. 二.正题: Trie树,也就是字典树(如图,其中包含单词he.her.hi.she) 从根节点到某一标记(涂黑)节点遍历一遍,得到的就是存进Trie树中的一个单词 三.操作 1.insert(插入) 首先我们可以编号每一个节点,在插入一个新的单词str时

Trie树入门及训练

什么叫Trie树? Trie树即字典树. 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. (以上来自百度百科,点这里) 在我看来,Trie树是一棵26叉树(如果是统计字母的话),典型的空间换时间.那到底我们利用Trie来做什么呢? 1.统计单词 2.匹配前缀 千篇一律地需要提到

Trie树基本概念和训练指南

接触Trie树是在选拔赛时候遇到一题目,TLE无数次依然无解,赛后发现字符串统计有一利器名曰"字典树",后来花了一段时间去写Trie,算是基本入门了. 本文主要是介绍一些基本概念,以及一些训练题目,提供大家. 什么叫Trie树? Trie树即字典树. 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字

Trie树讲解

Trie树简介:又称字典树.前缀树.单词查找树或键树,是一种用于快速检索的树形结构,是一种哈希树的变种 用途: 1.字符串检索:实现将一些字符串的有关信息保存到trie树中,查找另外一些字符串是否出现过或者出现的频率 2.前缀匹配:匹配前缀 3.排序:tire树是一颗多叉树,只需先序遍历整棵树,输出相应的字符串便是按字典序排序的结果 4.作为其他数据结构和算法的辅助结构:ac自动机.后缀数组 特点: 1.时间:建树时间复杂度 O(n*len),如果要查找长度为len的字符串是否存在,时间复杂度O

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

跳跃表,字典树(单词查找树,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]