zoukankan      html  css  js  c++  java
  • Trie 字典树模板

    #include <cstring>  
    #include <vector>  
    #include <cstdio>  
    using namespace std;  
    //***********************************************************************************************  
    const int maxnode = 4000 * 100 + 10;  
    const int sigma_size = 26;  
      
    // 字母表为全体小写字母的Trie  
    struct Trie {  
      int ch[maxnode][sigma_size];  
      int val[maxnode];  
      int sz; // 结点总数  
      void clear() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); } // 初始时只有一个根结点  
      int idx(char c) { return c - 'a'; } // 字符c的编号  
      
      // 插入字符串s,附加信息为v。注意v必须非0,因为0代表“本结点不是单词结点”  
      void insert(const char *s, int v) {  
        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] = v; // 字符串的最后一个字符的附加信息为v  
      }  
      
      // 找字符串s的长度不超过len的前缀  
      bool find(const char *s, int len) {  
        int u = 0;  
        for(int i = 0; i < len; i++) {  
          if(s[i] == '') break;  
          int c = idx(s[i]);  
          if(!ch[u][c]) break;  
          u = ch[u][c];  
          if(val[u] != 0) return true; // 找到一个前缀  
        }  
        return false;  
      }  
    };  
      
    //*****************************************************************************************************  
    //以下为模板测试  
    Trie trie;  
    const int maxl = 300000 + 10; // 文本串最大长度  
    const int maxw = 4000 + 10;   // 单词最大个数  
    const int maxwl = 100 + 10;   // 每个单词最大长度  
    char text[maxl], word[maxwl];  
    int main()  
    {  
        int n,m;  
        scanf("%d",&n);  
        trie.clear();  
        while(n--){  
            scanf("%s",word);  
            trie.insert(word,1);  
        }  
        scanf("%d",&m);  
        while(m--){  
            scanf("%s",text);  
            int l=strlen(text);  
            if(trie.find(text,l)) printf(""%s" in it
    ",text);  
            else printf(""%s" not in it
    ",text);  
        }  
        return 0;  
    } 
  • 相关阅读:
    Android ViewPager2 可垂直左右滑动使用【java】
    Android常用优秀开源框架
    Content-Type类型大全
    NodeJs FS 文件系统模块
    Nodejs 包与 npm第三方模块安装和 package.json 以及 cnpm
    Flutter Plugin开发简单示例
    Mysql创建数据库以及用户分配权限
    Android仿微信QQ等实现锁屏消息提醒
    android 桌面图标添加数字角标
    android7/8新特性 画中画、shortcut和分屏模式
  • 原文地址:https://www.cnblogs.com/cmbyn/p/8951271.html
Copyright © 2011-2022 走看看