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

    字典树

    预定义

     1 const int N = 1e6+10;
     2 int tot = 1;
     3 struct node
     4 {
     5     int son[26];
     6     int cnt;   // 特殊标记
     7     bool have;
     8     node()
     9     {
    10         memset(son,0,sizeof son);
    11         cnt = 0;
    12         have = false;
    13     }
    14 }trie[N];

    插入

     1 void Insert(char *s)
     2 {
     3     int len = strlen(s);
     4     int u = 0,v;
     5     for(int i = 0;i < len;i++)
     6     {
     7         v = s[i]-'a';
     8         if(!trie[u].son[v])
     9             trie[u].son[v] = tot++;
    10         u = trie[u].son[v];
    11     }
    12     trie[u].have = true;
    13 }

    查找

     1 int Find(char *s)
     2 {
     3     int len = strlen(s);
     4     int u = 0,v;
     5     for(int i = 0;i < len;i++)
     6     {
     7         v = s[i]-'a';
     8         if(!trie[u].son[v])
     9             return 0;
    10         u = trie[u].son[v];
    11     }
    12     if(!trie[u].have)   // 没有这个单词
    13         return 0;
    14     if(!trie[u].cnt)   // 没被查询过
    15     {
    16         trie[u].cnt++;
    17         return 1;
    18     }
    19     return 0;
    20 }

    注意

    涉及到多组输入的时候可以这样处理

     1 struct node
     2 {
     3     int son[26];
     4     int cnt;   // 特殊标记
     5     bool have;
     6     void clear
     7     {
     8         memset(son,0,sizeof son);
     9         cnt = 0;
    10         have = false;
    11     }
    12 }trie[N];
    13 
    14 int main()
    15 {
    16     trie[0].clear();
    17 }

    01字典树

    预定义

     1 const int N = 1e6+100;
     2 int tot = 1;
     3 struct node
     4 {
     5     int son[2];
     6     int size;
     7     node()
     8     {
     9         memset(son,0,sizeof son);
    10         size = 0;
    11     }
    12 }trie[32*N];

    插入

     1 void Insert(int x)
     2 {
     3     int root = 1;
     4     trie[root].size++;
     5     for(int k = 30;k >= 0;k--)
     6     {
     7         int tmp = 0;
     8         if(x & (1<<k))
     9             tmp = 1;
    10         if(!trie[root].son[tmp])
    11             trie[root].son[tmp] = ++tot;
    12         root = trie[root].son[tmp];
    13         trie[root].size++;
    14     }
    15 }

    删除

     1 void Delete(int x)
     2 {
     3     int root = 1;
     4     trie[root].size--;
     5     for(int k = 30;k >= 0;k--)
     6     {
     7         int tmp = 0;
     8         if(x & (1<<k))
     9             tmp = 1;
    10         root = trie[root].son[tmp];
    11         trie[root].size--;
    12     }
    13 }

    查询

     1 int Query(int x)
     2 {
     3     int root = 1;
     4     for(int k = 30;k >= 0;k--)
     5     {
     6         int tmp = 0;
     7         if(x & (1<<k))
     8             tmp = 1;
     9         if(tmp)
    10         {
    11             if(trie[root].son[0] && trie[trie[root].son[0]].size)
    12                 root = trie[root].son[0];
    13             else 
    14                 root = trie[root].son[1],x ^= (1<<k);
    15         }
    16         else 
    17         {
    18             if(trie[root].son[1] && trie[trie[root].son[1]].size)
    19                 root = trie[root].son[1],x ^= (1<<k);
    20             else 
    21                 root = trie[root].son[0];
    22         }
    23     }
    24     return x;
    25 }

    习题

    CF 706 D. Vasiliy’s Multiset

    Chip Factory (ACM Changchun 2015)

    HDU 4825 Xor Sum

    求完美序列度(待解决)

  • 相关阅读:
    0 到 1 掌握:Vue 核心之数据双向绑定
    前端性能优化, 从哪些方面入手? (缩略版)
    MDN中定义的Function.prototype.call()和apply()与bind()
    应聘前端开发的一次笔试题目(某数据挖掘分析公司)
    应聘前端开发的一次笔试题目(某电信子公司)
    应聘前端开发的一次笔试题目(某外资公司)
    算法之杨辉三角形(Java语言)
    算法之求质数(Java语言)
    微信小程序背景
    备份恢复(一)
  • 原文地址:https://www.cnblogs.com/duny31030/p/14304340.html
Copyright © 2011-2022 走看看