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

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

题目

代码

#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.kler.cn/a/526388.html

相关文章:

  • Java 大视界 -- Java 大数据在量子通信安全中的应用探索(69)
  • Golang笔记——常用库context和runtime
  • 数据结构与算法之栈: LeetCode 739. 每日温度 (Ts版)
  • C++中的类与对象(中)
  • 多协议网关BL110钡铼6路RS485转MQTT协议云网关
  • RPC是什么?和HTTP区别?
  • 基于Springboot的社区药房管理系统
  • 【练习】PAT 乙 1023 组个最小数
  • 镭速大文件传输自动选择压缩算法原理
  • 学技术学英语:elasticsearch查询的两阶段queryingfetching
  • 如何监控ubuntu系统某个程序的运行状态,如果程序出现异常,对其自动重启。
  • MATLAB的数据类型和各类数据类型转化示例
  • 基于新一代电子电器架构的SOA服务设计方法
  • DeepSeek R1与OpenAI o1深度对比
  • 智能家居监控系统数据收集积压优化
  • games101-作业3
  • 【漫话机器学习系列】069.哈达马乘积(Hadamard Product)
  • llama.cpp LLM_CHAT_TEMPLATE_DEEPSEEK_3
  • NLP模型大对比:Transformer >Seq2Seq > LSTM > RNN > n-gram
  • 能源行业区块链相关的书籍
  • 【Linux】线程互斥与同步
  • Python标准库 - os (2) 进程管理
  • 力扣116. 填充每个节点的下一个右侧节点指针
  • C#Halcon扇形/圆环缺陷检测(极坐标变换法)
  • 剑指 Offer II 010. 和为 k 的子数组
  • 设计模式Python版 建造者模式