zoukankan      html  css  js  c++  java
  • 字典树入门

    推荐博客 : http://blog.csdn.net/u013588639/article/details/38406453

         http://blog.csdn.net/king_cannon_fodder/article/details/77175620

    之所以称其为字典树,是因为它在使用的过程中就是一个类似查字典的过程,我们从第一个字母一个一个的往下面去找

    关于字典树的写法有两种,一种是用链表的形式去写,比较好懂,还有一种就是用数组的形式去写,通过结点的编号实现相连的过程。

    int ch[200010][27];  //节点编号     
    int sz;        //字典树节点个数  
    int val[200010];   //节点的值  
    void init()  
    {  
        sz=1;  
        memset(ch,0,sizeof(ch));  
        memset(val,0,sizeof(val));  
    }  
    void insert(char *s)  
    {  
        int u=0,c;  
        for(int i=0;i<strlen(s);i++)  
        {  
            c=s[i]-'a';  
            if(!ch[u][c])  
                ch[u][c]=sz++;  
            u=ch[u][c];  
            val[u]++;        //!!!  
        }  
    }  
    int query(char *s)  
    {  
        int u=0,c;  
        for(int i=0;i<strlen(s);i++)  
        {  
            c=s[i]-'a';  
            if(!ch[u][c])  
                return 0;  
            u=ch[u][c];  
        }  
        return  val[u];  
    } 
    

     此代码中注释的地方 , 可以放到 for 循环内,也可以放到 for 循环外面,根据不同的题有不同的方法,当在 for 循环内部时,用来表示的含义时 相同的前缀出现的次数,当在外面的时候给 val 变成 1 或 -1 表示这个串到这里结束。

    东北日出西边雨 道是无情却有情
  • 相关阅读:
    工作中碰到的小问题记录
    MySQL之路 ——1、安装跳坑
    C# 构造函数
    C# 操作文件类,文件夹存在判断,创建,文件内容读写。
    你为什么(不)用存储过程?
    C#基础巩固之基础类型
    mysql存储过程中使用事务
    Redis 安装
    Maven 国内映像
    mysql存储过程详解
  • 原文地址:https://www.cnblogs.com/ccut-ry/p/8558959.html
Copyright © 2011-2022 走看看