首页 > 其他分享 >字典树 trie

字典树 trie

时间:2023-09-07 19:46:36浏览次数:28  
标签:01 trie tree kMaxN int long include 字典

就是一棵树(完结

又回来了......

一棵树,每个节点可以表示一个字母

like this

Ps: p_2是因为画图工具的原因,实际上是p

那么,看这颗树。构成这颗树的单词可能不唯一。看下面例子。


现在来了一个单次 apple。我们发现 root(空)的下面没有 a , 新建一个a,现在发现a的下面没有p, 添加 p,以此类推。

第二个单词 apz 来了,发现 a有了, 发现 a 的后面有 p, 但后面没有 z, 新建。

又有单词 bo,按照上面方法新建。

看似一切没有问题。

但是问题来了,如果加一个 appl,ap, b呢?树不会发生改变,此时,我们需要一个cnt。


#include <cstring>
#include <fstream>
#include <iostream>
#include <vector>

using namespace std;

const int kMaxN = 3e6 + 5;

int n, t, a[kMaxN][90], cnt, ans, Cnt[kMaxN], q;
string s;

int zhuan(char x) { //将字母转换编号
  if (x >= 'A' && x <= 'Z') {
    return x - 'A';
  } else if (x >= 'a' && x <= 'z') {
    return x - 'a' + 26;
  } else {
    return x - '0' + 52;
  }
}

void Add(string s) { //添加单词
  int p = 0, l = s.size();
  for (int i = 0; i < l; i++) {
    int c = zhuan(s[i]);
    if (!a[p][c]) { //没出现
      a[p][c] = ++cnt; 
    }
    p = a[p][c]; //转移
  }
  Cnt[p]++; //标记

}

int check(string s) {
  int p = 0, ok = 0, l = s.size();
  for (int i = 0; i < l; i++) {
    int c = zhuan(s[i]);
    if (!a[p][c]) { //同理,查询失败
      return 0;
    }
    p = a[p][c];
  }
  return Cnt[p]; //返回次数
}

int main() 
   cin >> n >> t;
   for (int i = 1; i <= cnt; i++) {
     Cnt[i] = 0;
   }
   cnt = 0;
   for (int i = 1; i <= n; i++) {
     cin >> s;
     Add(s);
   }
   for (int i = 1; i <= t; i++) {
     ans = 0;
     cin >> s;
     cout << check(s) << '\n';
   }
  return 0;
}

这里不是模板题,而是实现了一个近似于hash的功能,判断出现了几个这个单词

接下开开始一个 01字典树

顾名思义, 01字典树就是将原本的字母变成01,其构建思路是一样的。

因为 它/他/她 只有 01,那么用途也有所改变。

最常见的用的就是最大异或值,利用贪心的思想, ^相同为0, 不同为1.最大就尽量不同。

CF706D

#include <iostream>

using namespace std;

const long long kMaxN = 6e6;

long long n, tree[kMaxN][2], Cnt[kMaxN], tot;
char c;

void update(long long x, long long op) {
  long long p = 0;
  for (long long i = 30; i >= 0; i--) {
    long long t = x >> i & 1;
    if (!tree[p][t]) {
      tree[p][t] = ++tot;
    }
    p = tree[p][t];
    Cnt[p] += op;
  }
}

long long Ans(long long x) {
  long long p = 0, ans = 0;
  for (long long i = 30; i >= 0; i--) {
    long long t = (x >> i & 1) ^ 1; //不一样的
    if (tree[p][t] && Cnt[tree[p][t]]) {  //能不一样
      p = tree[p][t];
      ans = ans << 1 | 1;
    } else {
      p = tree[p][t ^ 1]; //没得
      ans = ans << 1;
    }
  }
  return ans;
}

int main() {
  cin >> n;
  update(0, 1);
  for (long long i = 1, x; i <= n; i++) {
    cin >> c >> x;
    if (c == '?') {
      cout << Ans(x) << '\n';
    } else {
      update(x, (c == '+' ? 1 : -1));
    }
  }
  return 0;
}

标签:01,trie,tree,kMaxN,int,long,include,字典
From: https://www.cnblogs.com/jiangyuchen12/p/17685898.html

相关文章

  • [转] Linux下的字典生成工具Crunch,创造自己的专属字典
    Crunch是一种创建密码字典工具,按照指定的规则生成密码字典,可以灵活的制定自己的字典文件。使用Crunch工具生成的密码可以输出到屏幕,保存到文件、或另一个程序。由其在渗透测试需要爆破的时候,字典的编排等直接影响到我们的爆破速度,对整个渗透测试流程起着十分重要的作用。0x00安......
  • pytest.mark.parametrize() 字典
    yaml文件-action:list_orderkeywords:南京-action:list_orderkeywords:郑州-action:list_orderkeywords:西安代码:importjsonimportpprintimportpytestfromSlience.utils.login_utilimportLoginfromSlience.utils.request_utilimpo......
  • Python 字典的合并和值相加
    python实现:字典的合并(相同key的value相加)及字典的输出排序(各种意义下)_python字典合并与排序_Roxannekkk的博客-CSDN博客dict1={'a':2,'b':3}dict2={'a':3,'b':2}dict3={'c':3,'d':7}合并key相同,后一个字典覆盖前一个字典的value;key不同,新增dict1.update(dic......
  • openpyxl模块,把字典存入一个表格
    背景使用python把字典存入一个Excel表格在开发过程中,我们经常需要将数据保存到Excel中以便于后续分析和处理。Python提供了许多库来处理Excel文件,其中最流行的是openpyxl库。安装pipinstallopenpyxl使用fromopenpyxlimportWorkbookdefsave_to_execl(star_dict):......
  • Python 遍历字典的若干方法
    哈喽大家好,我是咸鱼我们知道字典是Python中最重要且最有用的内置数据结构之一,它们无处不在,是语言本身的基本组成部分我们可以使用字典来解决许多编程问题,那么今天我们就来看看如何在Python中遍历字典全文内容:https://realpython.com/iterate-through-dictionary-python/p......
  • SQLfuzz字典
    `~!@#$%^&*()-_=+[]{}|\;:'",.<>/?----+/**/&&||<>!(<>)andorxorifnotselectsleepunionfromwhereorderbyconcatgroupbenchmarklengthinisaslikerlikelimitoffsetd......
  • python字典、列表的综合应用(后宫选妃、个人ip、学籍管理系统)
    #后宫选妃+个人IP系统+学籍管理系统)代码#学籍管理系统print("====后宫选妃+个人IP系统+学籍管理三合一系统====")print("1.后宫选妃系统=")print("2.个人IP系统=")print("3.学籍管理系统......
  • 01-Trie - 解决异或问题的 Trie
    前言Trie树就是所谓的字典树(前缀树),每个节点都是一个字母,用来解决单词匹配的问题。而01-Trie是一种特殊的字典树,其中的节点的值都在\({0,1}\)中。01-Trie可以用来解决一部分异或问题。......
  • 前缀树(Trie)的java实现
    前缀树prefixtree,又叫做trie。关键Feature如下:树形结构根节点为空结点包含Node[]nexts;//size26intisEnd;//有多少个字符串以当前字符结尾intpass;//多少个字符串经过了当前字符常用操作insertdeletesearch//字符串在前缀树中出现的次数prefi......
  • python字典的应用一(增删改查)
    #一.有如下字典内容用程序解答下面的题目dic={'python':95,'java':99,'c':100}#1.字典的长度是多少print(len(dic))#2.请修改'java'这个key对应的value值为98dic["java"]=98print(dic)#3.删除c这个keydeldic["c"]print(di......