当前位置: 首页 > article >正文

【数据结构】字典树(Trie树)算法总结

知识概览

  • Trie:高效地存储和查找字符串集合的数据结构
  • 数字、汉字可以用二进制位来存

例题展示

题目链接

Trie字符串统计:

https://www.acwing.com/problem/content/837/

代码

#include <cstdio>

const int N = 100010;

int son[N][26], cnt[N], idx;  // 下标是0的点,既是根节点,又是空节点
char str[N];

void insert(char str[])
{
    int p = 0;
    for (int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a';
        if (!son[p][u]) son[p][u] = ++idx;
        p = son[p][u];
    }
    
    cnt[p]++;
}

int query(char str[])
{
    int p = 0;
    for (int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a';
        if (!son[p][u]) return 0;
        p = son[p][u];
    }
    
    return cnt[p];
}

int main()
{
    int n;
    scanf("%d", &n);
    while (n--)
    {
        char op[2];
        scanf("%s%s", op, str);
        if (op[0] == 'I') insert(str);
        else printf("%d\n", query(str));
    }
    
    return 0;
}

题目链接

最大异或对:

https://www.acwing.com/problem/content/145/

题解

对于每个数,先插入,然后再找和这个数异或最大的数,找的方法是找已存储在字典树的数,从高位到低位,尽量找和当前数该位不同的数。最终得到的数即为所求。

代码

#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 100010, M = 31 * N;

int n;
int son[M][2], idx, x;

void insert(int x)
{
    int p = 0;
    for (int i = 30; i >= 0; i--)
    {
        int u = x >> i & 1;
        if (!son[p][u]) son[p][u] = ++idx;
        p = son[p][u];
    }
}

int query(int x)
{
    int p = 0, res = 0;
    for (int i = 30; i >= 0; i--)
    {
        int u = x >> i & 1;
        if (son[p][!u])
        {
            p = son[p][!u];
            res = res * 2 + !u;
        }
        else
        {
            p = son[p][u];
            res = res * 2 + u;
        }
    }
    
    return res;
}

int main()
{
    scanf("%d", &n);
    
    int res = 0;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &x);
        insert(x);
        int t = query(x);
        res = max(res, x ^ t);
    }
    
    printf("%d\n", res);
    
    return 0;
}


http://www.kler.cn/a/162339.html

相关文章:

  • 自由学习记录(21)
  • Docker compose部署portainer
  • 深入探索React合成事件(SyntheticEvent):跨浏览器的事件处理利器
  • Flink1.19编译并Standalone模式本地运行
  • 大数据新视界 -- 大数据大厂之 Impala 存储格式转换:从原理到实践,开启大数据性能优化星际之旅(下)(20/30)
  • 【数据结构与算法】第12课—数据结构之归并排序
  • pydantic的基础用法
  • STM32-OLED显示屏
  • 2023 金砖国家职业技能大赛网络安全省赛理论题样题(金砖国家未来技能挑战赛)
  • 基于Java酒店管理系统
  • DedeCms后台文章列表文档id吗?或者快速定位id编辑文章
  • 【Node.js】基础梳理 6 - MongoDB
  • 安全快速地删除 MySQL 大表数据并释放空间
  • 微信小程序 - 创建 ZIP 压缩包
  • Termux
  • VIT总结
  • 算法学习—排序
  • 用网安技术去合法挖漏洞,一个月能拿多少钱?想不到吧!
  • NVMe Over Fabrics with iRDMA总结 - 1
  • WT2605-24SS录放音语音芯片:便捷按键功能提升用户体验
  • linux下查看文件当下的所有文件的大小和查找大文件
  • 线性动态规划
  • 《使用ThinkPHP6开发项目》 - 设置项目环境变量
  • 在线教育小程序如何一键生成App
  • 使用微信虚拟支付后端请求API总是支付签名校验失败
  • 参加百度Apollo技术沙龙—感受自动驾驶的魅力