字典树

原创 2015年07月06日 21:29:33
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<cmath>

#define ll __int64
#define MAX 500009

using namespace std;

const int sigma_size = 26;
const int maxnode = 500000;

struct Tire
{
    int ch[maxnode][sigma_size];
    int val[maxnode];
    int sz;//节点总数
    Tire()
    {
        sz = 1;//初始时只有一个根结点
        memset(ch[0],0,sizeof(ch[0]));
        memset(val,0,sizeof(val));
    }
    int idx(char c)
    {
        return c - 'a';//字符C的编号
    }
    //插入字符,附加信息为V,注意V必须为非0,因为0代表本节点不是单词节点
    void Insert(char* s)
    {
        int u = 0,n = strlen(s);
        for(int i = 0; i<n; i++)
        {
            int c = idx(s[i]);
            if(!ch[u][c])//结点不存在
            {
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz] = 0; //中间结点清0
                ch[u][c] = sz++;//新建结点
            }
            u = ch[u][c];//往下走
            val[u]++;//字符串结点附加条件
        }
    }
    int Find(char* s)
    {
        int flag = 0;
        int u = 0,n = strlen(s);
        int c;
        for(int i =0;i<n;i++)
        {
            c = idx(s[i]);
            if(!ch[u][c]) return 0;
            if(i+1==n)break;
            u = ch[u][c];
        }
        return val[ch[u][c]];
    }
}A;

int main()
{
    int x,y;
    char xx[MAX];
    char yy[MAX];
    scanf("%d",&x);
    for(int j = 0;j<x;j++)
    {
        scanf("%s",&xx);
        A.Insert(xx);
    }
    scanf("%d",&y);
    for(int i = 0;i<y;i++)
    {
        scanf("%s",yy);
        if(A.Find(yy))
        {
            cout<<A.Find(yy)<<endl;
        }
        else
            cout<<0<<endl;
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

字典树数组实现

字典树是一种很实用也相对好理解的数据
  • u013588639
  • u013588639
  • 2014年08月06日 21:04
  • 1563

字典树 c++ 实现

字典树 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串), 所以经常被搜索引擎系统用于文本词频统计。它...
  • rongdongzhu1
  • rongdongzhu1
  • 2015年09月13日 16:16
  • 1046

字典树(Trie树)用法及例子(一)

字典树(Trie)概述字典树,又名Trie树。顾名思义,在字典中很好用。我们在查牛津词典时都是先按第一个字母找到以这个字母为首的单词所在的初始位置,在此位置的基础上,再按照第二个字母继续找。。。 插...
  • u010902721
  • u010902721
  • 2015年05月15日 20:53
  • 4273

01字典树 小结

为了做13年南京网络赛的一道题 学了这个01字典树 看了别人的模板 之后切了几道水题 现在总结一下01字典树的实现可以看成是把一个数的二进制字符化后插入到一颗一般的字典树中比如在01字典树种插入...
  • SolarDomo
  • SolarDomo
  • 2016年08月10日 10:15
  • 1283

《字典树》数组模版

#include #include using namespace std; const int N=1000005; int trie[N][26],cnt[N],flag[N],num; vo...
  • a709743744
  • a709743744
  • 2016年01月26日 21:05
  • 491

字典树简介和简易应用

1、背景         词汇搜索、词频统计等字符串操作,是搜索引擎、文本处理系统等经常使用的业务,现在假设有这么一个简单的文本处理例子:有一篇10000个词的文章,要查出单词“was”在这篇文章中出...
  • ly01kongjian
  • ly01kongjian
  • 2013年03月31日 16:15
  • 4017

字典树模板(数组实现和指针实现)

字典树的指针实现:  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
  • king_cannon_fodder
  • king_cannon_fodder
  • 2017年08月15日 08:41
  • 287

hdu2846(字典树好题)

字典树的好题 题意:给你n个串,然后又q次询问,输出n个串中包含改串的个数 思路:这题非常考验个人的分析能力,最初的想法是用AC自动机或者是后缀数组做,但有感觉不可行,最后看了题解才知道要用字典树...
  • u013509299
  • u013509299
  • 2014年08月02日 22:54
  • 668

字典树的题目 找了个时间刷了一点字典树的题目

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2009/pid/2828 #includ...
  • qq_33435265
  • qq_33435265
  • 2017年04月26日 09:24
  • 235

字典树数组形式写法

第一题: Remember the Word Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %l...
  • DoJintian
  • DoJintian
  • 2015年08月05日 17:04
  • 1063
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字典树
举报原因:
原因补充:

(最多只允许输入30个字)