首页 > 其他分享 >[模板]01trie,维护异或最大值

[模板]01trie,维护异或最大值

时间:2023-07-08 16:25:10浏览次数:41  
标签:01trie int res trie01 trie 异或 vector -- 模板

// 查询异或最大值,每次插入和查询时间都是log(C)
template<class T>
class trie01 {
    vector<vector<T>> tree;
public:
    trie01() : tree(1, vector<T>(2, 0)) {}

    // 插入待检查的数字
    void insert (T x)
    {
        int p = 0;
        for(int i = sizeof(x)*8-2; i >= 0; --i)
        {
            bool o = (x&((T)1<<i));
            if(tree[p][o] == 0)
            {
                tree[p][o] = tree.size();
                tree.emplace_back(2,0);
            }
            p = tree[p][o];
        }
    }

    // 查询在插入的数字中,返回与x异或后的最大值
    T match (T x)
    {
        T t = x, p = 0;
        // 从高位到低位
        for(int i = sizeof(x)*8-2; i >= 0; --i)
        {
            bool o = (x&((T)1<<i));
            if(tree[p][!o])
                p = tree[p][!o], t = t|((T)1<<i);
            else if(tree[p][o])
                p = tree[p][o], t = t&(~((T)1<<i));
        }
        return t;
    }
};

已通过 [数组中两个数的最大异或值](421. 数组中两个数的最大异或值 - 力扣(Leetcode))

template<class T>
class trie01 {
    vector<vector<T>> tree;
public:
    trie01() : tree(1, vector<T>(2, 0)) {}

    void insert (T x)
    {
        int p = 0;
        for(int i = sizeof(x)*8-2; i >= 0; --i)
        {
            bool o = (x&((T)1<<i));
            if(tree[p][o] == 0)
            {
                tree[p][o] = tree.size();
                tree.emplace_back(2,0);
            }
            p = tree[p][o];
        }
    }

    T match (T x)
    {
        T t = x, p = 0;
        // 从高位到低位
        for(int i = sizeof(x)*8-2; i >= 0; --i)
        {
            bool o = (x&((T)1<<i));
            if(tree[p][!o])
                p = tree[p][!o], t = t|((T)1<<i);
            else if(tree[p][o])
                p = tree[p][o], t = t&(~((T)1<<i));
        }
        return t;
    }
};
class Solution {
public:
    int findMaximumXOR(vector<int>& nums) {
        trie01<int> trie;
        trie.insert(nums[0]);
        int res = 0;
        for(auto &a : nums)
            res = max(res, trie.match(a)), trie.insert(a);
        return res;
    }
};

已通过 [E. Sausage Maximization](Problem - 282E - Codeforces)

#include <iostream>
#include <vector>
using namespace std;

using ll = long long;
template<class T>
class trie01 {
    vector<vector<T>> tree;
public:
    trie01() : tree(1, vector<T>(2, 0)) {}

    void insert (T x)
    {
        int p = 0;
        for(int i = sizeof(x)*8-2; i >= 0; --i)
        {
            bool o = (x&((T)1<<i));
            if(tree[p][o] == 0)
            {
                tree[p][o] = tree.size();
                tree.emplace_back(2,0);
            }
            p = tree[p][o];
        }
    }

    T match (T x)
    {
        T t = x, p = 0;
        // 从高位到低位
        for(int i = sizeof(x)*8-2; i >= 0; --i)
        {
            bool o = (x&((T)1<<i));
            if(tree[p][!o])
                p = tree[p][!o], t = t|((T)1<<i);
            else if(tree[p][o])
                p = tree[p][o], t = t&(~((T)1<<i));
        }
        return t;
    }
};

int main()
{
    
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    trie01<ll> trie;

    int n; cin>>n;
    vector<ll> arr(n);
    ll sum = 0, res = 0;
    for(auto &a : arr) {
        cin >> a;
        sum ^= a;
        res = max(res, a);
        trie.insert(sum);
    }
 
    sum = 0;
    for(int i = n-1; i >= 0; --i)
    {
        sum ^= arr[i];
        res = max(res, trie.match(sum));
    }
    cout << res << endl;
    return 0;
}

标签:01trie,int,res,trie01,trie,异或,vector,--,模板
From: https://www.cnblogs.com/hellozhangjz/p/17537399.html

相关文章

  • OSG 使用整理(5):模板测试与边缘效果
    osg使用整理(5):模板测试与边缘效果1模板测试​ 在渲染管线中,模板测试在片段着色器后执行,通过像素与模板缓冲中的模板值比较,选择性丢弃或者保存这个像素颜色。我们可以通过更新模板测试来获得一些很有意思的效果。下图为LearnOpenGL网站一个例子。​ 可以发现,颜色缓冲经过模......
  • 15款最佳的HTML5移动模板
    如果你需要响应式和前端开发,那么HTML5是你务必要学会的Web开发语言。我们在Codecondo上发布的HTML5相关文章依然很受欢迎。例如:为HTML5开发者准备的40个工具、针对HTML5的Web框架,你一定要看看它们,我也相信它们会成为你书签的其中之一。当人们上网搜索登陆页面的时候,他们大多是寻......
  • P3378 【模板】二叉堆
    [洛谷]P3378【模板】堆方法一手写堆最小堆插入从新增的最后一个结点的父结点开始,用要插入元素向下过滤上层结点(相当于要插入的元素向上渗透)voidsiftdown(inti)//传入一个需要向下调整的结点编号i,这里传入1,即从堆的顶点开始向下调整{intt,flag=0;//flag用来标......
  • 洛谷题解——【模板】堆
    题目链接:【模板】堆【模板】堆题目描述给定一个数列,初始为空,请支持下面三种操作:给定一个整数\(x\),请将\(x\)加入到数列中。输出数列中最小的数。删除数列中最小的数(如果有多个数最小,只删除\(1\)个)。输入格式第一行是一个整数,表示操作的次数\(n\)。接下来\(n\)......
  • C++ 设计模式之模板方法模式
    设计模式之模板方法模式模板方法模式,定义一个操作中的算法的股价,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。说白了就是有一个算法有很多部分,这个算法在基类中已经定义好了。而算法中的各个部分都写成各个成员函......
  • JAVA设计模式之模板模式
    设计模式设计模式(DesignPattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、......
  • 解决Android studio 新建文件固定创建人创建时间模板的具体操作步骤
    AndroidStudio新建文件固定创建人创建时间模板在开发Android应用程序时,我们经常需要创建许多不同类型的文件,例如Activity、Fragment、Adapter等。为了提高开发效率,我们可以在AndroidStudio中使用模板来自动生成这些文件的代码。在本文中,我们将介绍如何在AndroidStudio中创建一......
  • 李超线段树模板
    细节和理解详见注释题目:https://www.luogu.com.cn/problem/P4097#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintmod1=39989;constintmod2=1e9;constdoubleeps=1e-9;typedefpair<double,int>pdi;intlasans;//细节://注意42排,开始......
  • 微信模板消息推送封装方法
    /***@explain*发送消息通知*@returnarray|mixed*@remark*获取到用户的openid之后可以判断用户是否有数据,可以直接跳过获取access_token,也可以继续获取access_token*access_token每日获取次数是有限制的,access_token有时间限制,可以存储到数据库7200s.7200s后access......
  • wpf样式模板的使用
    <Windowx:Class="WpfApp1.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:x="http://schemas.micro......