【异或和之差——Trie,DP】

news/2025/1/31 19:22:37 标签: 算法

题目

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int lmax[N], lmin[N], rmax[N], rmin[N];
int ltr[1 << 22][3], rtr[1 << 22][3], idx;
int n, a[N], la[N], ra[N];
void add(int x, int tr[][3])
{
    int p = 0;
    for (int i = 20; i >= 0; i--)
    {
        int u = (x >> i) & 1;
        if (tr[p][u])
            p = tr[p][u];
        else
            p = tr[p][u] = ++idx;
    }
}
int findmax(int x, int tr[][3])
{
    int retv = 0, p = 0;
    for (int i = 20; i >= 0; i--)
    {
        int u = (x >> i) & 1;
        if (tr[p][!u])
        {
            retv += 1 << i;
            p = tr[p][!u];
        }
        else
            p = tr[p][u];
    }

    return retv;
}
int findmin(int x, int tr[][3])
{
    int retv = 0, p = 0;
    for (int i = 20; i >= 0; i--)
    {
        int u = (x >> i) & 1;
        if (tr[p][u])
            p = tr[p][u];
        else
        {
            p = tr[p][!u];
            retv += 1 << i;
        }
    }

    return retv;
}
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    for (int i = 0; i <= n+1; i++) //最值计算需要涉及两个边界
    {
        lmax[i] = rmax[i] = 0;
        lmin[i] = rmin[i] = inf;
    }
    
    add(0, ltr); //压入la[0]
    for (int i = 1; i <= n; i++)
    {
        la[i] = la[i - 1] ^ a[i];
        lmax[i] = max(lmax[i - 1], findmax(la[i], ltr));
        lmin[i] = min(lmin[i - 1], findmin(la[i], ltr));
        add(la[i], ltr);
    }

    idx = 0;
    add(0, rtr); //压入ra[0]
    for (int i = n; i >= 1; i--)
    {
        ra[i] = ra[i + 1] ^ a[i];
        rmax[i] = max(rmax[i + 1], findmax(ra[i], rtr));
        rmin[i] = min(rmin[i + 1], findmin(ra[i], rtr));
        add(ra[i], rtr);
    }

    int ans = 0;
    for (int i = 1; i <= n; i++)
    {
        ans = max(ans, lmax[i] - rmin[i + 1]);
        ans = max(ans, rmax[i + 1] - lmin[i]);
    }

    cout << ans;
}


http://www.niftyadmin.cn/n/5838847.html

相关文章

深度学习指标可视化案例

TensorBoard 代码案例&#xff1a;from torch.utils.tensorboard import SummaryWriter import torch import torchvision from torchvision import datasets, transforms# 设置TensorBoard日志路径 writer SummaryWriter(runs/mnist)# 加载数据集 transform transforms.Comp…

C28.【C++ Cont】顺序表的实现

&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;初二篇&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8;&#x1f9e8; 目录 1.知识回顾…

Golang 并发机制-2:Golang Goroutine 和竞争条件

在今天的软件开发中&#xff0c;我们正在使用并发的概念&#xff0c;它允许一次执行多个任务。在Go编程中&#xff0c;理解Go例程是至关重要的。本文试图详细解释什么是例程&#xff0c;它们有多轻&#xff0c;通过简单地使用“go”关键字创建它们&#xff0c;以及可能出现的竞…

【Web开发】一步一步详细分析使用Bolt.new生成的简单的VUE项目

https://bolt.new/ 这是一个bolt.new生成的Vue小项目&#xff0c;让我们来一步一步了解其架构&#xff0c;学习Vue开发&#xff0c;并美化它。 框架: Vue 3: 用于构建用户界面。 TypeScript: 提供类型安全和更好的开发体验。 Vite: 用于快速构建和开发 主界面如下&#xff1a…

图论——spfa判负环

负环 图 G G G中存在一个回路&#xff0c;该回路边权之和为负数&#xff0c;称之为负环。 spfa求负环 方法1:统计每个点入队次数, 如果某个点入队n次, 说明存在负环。 证明&#xff1a;一个点入队n次&#xff0c;即被更新了n次。一个点每次被更新时所对应最短路的边数一定是…

Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年

Android Studio 1.0 宣发于 2014 年 12 月&#xff0c;而现在时间来到 2025 &#xff0c;不知不觉间 Android Studio 已经陪伴 Androider 走过十年历程。 Android Studio 10 周年&#xff0c;也代表着了我的职业生涯也超十年&#xff0c;现在回想起来依然觉得「唏嘘」&#xff…

每日一题——序列化二叉树

序列化二叉树 BM39 序列化二叉树题目描述序列化反序列化 示例示例1示例2 解题思路序列化过程反序列化过程 代码实现代码说明复杂度分析总结 BM39 序列化二叉树 题目描述 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树。二叉树的序列化是将二叉树按照某种遍历方式…

jQuery小游戏(一)

jQuery小游戏&#xff08;一&#xff09; 嘻嘻&#xff0c;今天我们来写个jquery小游戏吧 首先&#xff0c;我们准备一下写小游戏需要准备的佩饰&#xff0c;如果&#xff1a;图片、音乐、搞怪的小表情 这里我准备了一些游戏中需要涉及到的图片 游戏中使用到的方法 eval() 函…