首页 > 其他分享 >前缀树

前缀树

时间:2024-12-20 15:22:01浏览次数:4  
标签:status 前缀 int tree want ans cur

[Algo] 前缀树

1. 静态数组实现前缀树

// 静态数组实现前缀树
int cnt = 0;
int tree[MAX + 1][26];
int pass[MAX + 1];
int End[MAX + 1];

void build()
{
    cnt = 1;
}

void clear()
{
    for (int i = 1; i <=cnt; i++)
    {
        for (int j = 0; j < 26; j++) tree[i][j] = 0;
        pass[i] = 0;
        End[i] = 0;
    }
}

void insert(const string &s)
{
    int cur = 1;
    pass[cur]++;
    for (const char &ch : s)
    {
        int index = ch - 'a';
        if (tree[cur][index] == 0) tree[cur][index] = ++cnt;
        cur = tree[cur][index];
        pass[cur]++;
    }
    End[cur]++;
}

int searchWord(const string &s)
{
    int cur = 1;
    for (const char &ch : s)
    {
        int index = ch - 'a';
        if (tree[cur][index] == 0) return 0;
        cur = tree[cur][index];
    }
    return End[cur];
}

int searchPrefix(const string &s)
{
    int cur = 1;
    for (const char &ch : s)
    {
        int index = ch - 'a';
        if (tree[cur][index] == 0) return 0;
        cur = tree[cur][index];
    }
    return pass[cur];
}

void erase(const string &s)
{
    if (searchWord(s) == 0) return;
    int cur = 1;
    pass[cur]--;
    for (const char &ch : s)
    {
        int index = ch - 'a';
        if (--pass[tree[cur][index]] == 0) { tree[cur][index] = 0; return; }
        cur = tree[cur][index];
    }
    End[cur]--;
}

2. 数组中两数的最大异或值

// 1. 数组中两数的最大异或值
// https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/description/
int cnt = 0;
int tree[MAX + 1][2];

void insert(const int num)
{
    int cur = 1;
    for (int i = 31, status; i >= 0; i--)
    {
        status = (num >> i) & 1;
        int index = status;
        if (tree[cur][index] == 0) tree[cur][index] = ++cnt;
        cur = tree[cur][index];
    }
}

void build(const vector<int> &v)
{
    cnt = 1;
    for (const auto &e : v) insert(e);
}

int maxXor(const int num)
{
    int cur = 1;
    int ans = 0;
    for (int i = 31, status, want; i >= 0; i--)
    {
        status = (num >> i) & 1;
        want = status ^ 1;
        if (tree[cur][want] == 0) want = want ^ 1;
        ans |= (status ^ want) << i;
        cur = tree[cur][want];
    }
    return ans;
}

int arrMaxXor(const vector<int> &v)
{
    build(v);
    int ans = 0;
    for (auto e : v) ans = max(ans, maxXor(e));
    return ans;
}

标签:status,前缀,int,tree,want,ans,cur
From: https://www.cnblogs.com/yaoguyuan/p/18619349

相关文章

  • 除自身以外数组的乘积(前缀积+后缀积)
    给你一个整数数组 nums,返回数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32位 整数范围内。请 不要使用除法,且在 O(n) 时间复杂度内完成此题。 示......
  • 14. 最长公共前缀
    题目链接解题思路:用第一个字符串的每个字符,逐个比较其他字符串,注意别越界就行代码classSolution{public:stringlongestCommonPrefix(vector<string>&strs){stringans="";intlen=strs[0].length();intn=strs.size();......
  • pojo实体bool字段不要加is前缀
    pojo实体bool字段不要加is前缀,在lombok这类工具自动的getter,setter方法时,对于布尔类型,它有自己的命名规则,boolean会把getter方法添加统一前缀is,如boolean的getter方法就是isDefault(),而如果你的字段也命名为isDefault,那么在反序化时可能出现歧义(default不是isDefault);而问题更......
  • leetcode2055. 蜡烛之间的盘子 - 前缀和
    2055.蜡烛之间的盘子这道题目作为比较单纯的前缀和题目,不需要额外的一些知识,只需要了解前缀和数组的生成与使用即可,并且也有一定的难度(难度分1819),是一个比较好的前缀和例题。题干算术评级:6第64场双周赛Q3给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从0开始......
  • 【算法】—— 前缀和
    一、区间求和问题给定一个长度为n的序列a,有m次查询,每次查询输出一个连续区间的和。使用暴力做法求解是将每次查询都遍历该区间求和//暴力做法importjava.util.Scanner;publicclassTest{publicstaticvoidmain(String[]args){Scannerscan=newS......
  • MySQL 索引的最左前缀匹配原则是什么?
    MySQL索引的最左前缀匹配原则最左前缀匹配原则是MySQL使用联合索引时的一个重要优化规则。它指的是在查询条件中,只有符合索引最左侧字段开始的连续前缀部分时,索引才能被有效利用。1.最左前缀匹配的含义联合索引:一个索引包含多个列,如CREATEINDEXidx_colONtable(a,b......
  • ACL与Prefix List(前缀列表)
    匹配工具一般搭配其他操作,可实现NAT,路由策略,策略路由,MQC,流量过滤等操作通配符掩码我们都知道子网掩码的1是精确匹配,1是大致匹配,1必须连续我们也知道反掩码的1是大致匹配,0是精确匹配,0必须连续那么通配符掩码其实和反掩码很像,ta的0也是精确匹配,1也是大致匹配,但与前两者不同......
  • 编程题-最长公共前缀
    题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。示例1:输入:strs=["flower","flow","flight"]输出:"fl"示例2:输入:strs=["dog","racecar","car"]输出:""解释:输入不存在公共前缀。解题:依......
  • 从 动态前缀和 到 树状数组
    一.引言——动态前缀和前缀和求解我会在最后给出,想看的直接翻到最后,这里默认大家都知道前缀和怎么求解。有这么一个场景,我们需要不断修改数组中的元素,并且问我们数组内某个区间的和。如果使用最原始的前缀和来求解,每次我们都要重新求一遍sum[],更新时间复杂度是O(n)的,查询是O(1)的......
  • 打卡信奥刷题(382)用C++信奥B3693[普及组/提高] 数列前缀和 4
    数列前缀和4题目背景这次不是数列的问题了。题目描述给定一个nnn行mm......