Acwing 1414.牛异或

2023-10-27

在这里插入图片描述
输入样例

5
1
0
5
4
2

输出样例

6 4 5

刚开始看到这个题,我是毫无思绪,看了一下题解:

https://www.acwing.com/video/2339/

老师说这个是最大异或对的变形
于是我去找了一下最大异或对
在这里插入图片描述

看完之后我只能想到暴力解决,然后看了样例10^5,我就知道是行不通的,但是确实想不到好一点的办法。
老规矩,看了视频之后。

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

我从老师了解到一个trie串写法好像是用二维数组实现把每一个元素存在一个二维数组中。
在这里插入图片描述
核心关键(一个节点的所有子孙都有相同的前缀)
代码就由此而来

#include<iostream>
#include<algorithm>
using namespace std;
const int N=31*1e5+10;//因为数据的范围是2的31次方所以二进制有31位
int trie[N][2];//用二维数组把每一个数二进制每一位存储下来
int idx;//用idx来给未分配的标记
void get(int x)
{
    int p=0;
    for(int i=30;i>=0;i--)
    {
        int s=x >> i & 1;//x二进制第i位表示的数字
        if(!trie[p][s]) trie[p][s]=++idx;//把他放到trie保存
        //保存方式,trie[p][s]里面放着是子节点的下标,真正存放**x二进制第i位表示的数字**的是列下标
        p=trie[p][s];//转移到子节点
    }
}
int f(int y)//寻找与他异或和最大的数
{
    int p=0,res=0;
    for(int i=30;i>=0;i--)
    {
        int s=y>>i&1;
        if(trie[p][!s]) {res=res*2+!s;p=trie[p][!s];}
        else
        {
            res=res*2+s;p=trie[p][s];//秦九昭算法 res=res*进制+n(从高位到低位每一位对应的数)
        }
    }
    return res;
}
int main(void)
{
    int n,t,cot=0;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>t;
        get(t);
        int zj=f(t);
        cot=max(cot,zj^t);
    }
    cout<<cot;
}

做完最大异或对,我还是没有搞很清楚这是怎么做牛异或。当老师说从i-j的异或等于Sj^Si-1我就有点懵逼了
然后我自己证明了一下结果有了思路,把他变成类似于一个前缀和的形式,然后把他同最大异或对的思路来做就可以了。
在这里插入图片描述
然后我们发现这可以转换为前缀和中找最大异或和,于是代码如下

#include<iostream>
#include<algorithm>
using namespace std;
const int N=21*(1e5+10);
int trie[N][2],g[100010];
int id[N],idx;
void insert(int x,int d)//这些操作和求最大异或和一致
{
    int p=0;
    for(int i=20;i>=0;i--)
    {
        int s=x>>i&1;
        if(!trie[p][s]) trie[p][s]=++idx;
        p=trie[p][s];
    }
    id[p]=d;
}
int quiry(int y)
{
    int p=0;
    for(int i=20;i>=0;i--)
    {
        int s=y>>i&1;
        if(trie[p][!s]) p=trie[p][!s];
        else
        p=trie[p][s];
    }
    return id[p];
}
int main(void)
{
    int n,res=-1,l=1,r=1;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>g[i];
        g[i]^=g[i-1];
    }
    insert(g[0],0);
    //需要注意的细节,要是不填进去的话,如果只有一项,则会找自己也就是本身那么异或为0则不是我
    //们想求的答案
    for(int i=1;i<=n;i++)
    {
        int u=quiry(g[i]);
        int sum=g[u]^g[i];
        if(res<sum) res=sum,l=u+1,r=i;
        insert(g[i],i);
    }
    cout<<res<<" "<<l<<" "<<r;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Acwing 1414.牛异或 的相关文章

随机推荐

  • c语言opencv的阅卷系统硬件要求,VS2019+Opencv4.0+Win10配置详解

    一 下载OpenCV4 0的安装文件 然后安装到你想要的地方 二 添加到Path里面 并且把文件opencv world400 dll和opencv world400d dll文件复制到 C Windows SysWOW64这个文件夹 三
  • vscode配置保存自动格式化

    要在VSCode中保存文件时自动进行格式化 您可以按照以下步骤进行配置 打开VSCode并打开您要编辑的项目文件夹 点击左侧边栏最底部的 设置 按钮 在搜索栏中输入 save 然后选择 首选项 在保存时运行格式化程序 选项 将此选项打开 这
  • 电子科技大学编译原理复习笔记(八):语义分析

  • 2021宝应各高中高考成绩查询,2019扬州大市各高中高考情况如何,看超全喜报!...

    原标题 2019扬州大市各高中高考情况如何 看超全喜报 关注了解更多信息 2019年高考扬州大市各校喜报 扬州中学喜报 2019年扬州中学高考扬州市文理双状元 扬州中学 理科生罗筱溪 高考成绩433分 全省排名前十 文科生苏泺健 高考成绩4
  • 微店 Android 插件化实践

    随着微店业务的发展 App不可避免的也遇到了65535的大坑 除此之外 业务模块增多 代码量增大所带来的问题也逐渐显现出来 模块耦合度高 协作开发困难 编译时间过长等问题严重影响了开发进程 在预研了多种方案以后 插件化似乎是解决这些问题比较
  • DVWA靶场虚拟机搭建教程

    DVWA是一款面世时间较长的Web渗透靶场 向网络安全专业人员提供合法的专业技能和应用测试环境 其特点是提供了包含Low Medium High Impossible四个等级的渗透防护 防护等级越高 渗透难度越大 平时常用于我们进行XSS
  • Visual Studio 2019 + OpenGL环境配置

    使用的是 gl h glu h glaux h 下载目录 https download csdn net download boyinc0de 11171372 在 接下来 包含目录对应下载下来的文件 解压开来的include文件夹 库目录
  • C ++ STL中的set :: find()函数

    C STL set find 函数 C STL set find function set find function is a predefined function it is used to check whether an elem
  • mysql 日期比较 between的用法的意思_Mysql 中现在仍旧不知道的小知识点

    重点 表结构的增删改 alter table t students add id int alter table t students drop id alter table t students modify id varchar 20
  • python 逻辑回归 summary_python – 为什么statsmodels和R之间的逻辑回归结果不同?

    我试图比较 python的statsmodels和R中的逻辑回归实现 import statsmodels api as sm import pandas as pd import pylab as pl import numpy as n
  • Vue.js 学习笔记十三:Vue Router 之 keep-alive

    目录 keep alive keep alive 有时候我们不希望组件被重新渲染影响使用体验 或者处于性能考虑 避免多次重复渲染降低性能 而是希望组件可以缓存下来 维持当前的状态 这时候就可以用到 keep alive 组件 keep al
  • Java开发设计模式-工厂模式-Factory

    1 工厂模式简介 工厂模式 Factory Pattern 是 Java 中最常用的设计模式之一 这种类型的设计模式属于创建型模式 它提供了一种创建对象的最佳方式 在工厂模式中 我们在创建对象时不会对客户端暴露创建逻辑 并且是通过使用一个共
  • thinkphp5学习路程 一 thinphp5的简单上手

    首先我们将php的环境配置好 能正常运行 这方面就不细说了 本人是windows系统 主要是给自己当笔记用 多写写总是好的 只看不练学不会 thinkphp5完全开发手册 http www kancloud cn manual thinkp
  • 第二专题 第三道题

    1 题目编号 1001 2 简单题意 知道一个公式8 x 4 7 x 3 2 x 2 3 x 6 y 给定T组数据 每组数据中给出y值 让求x 且y大于等于x等于0小于等于x等于100 3 解题思路形成过程 看到这道题就会想到数太大 容易超
  • Element 级联组件实现省市区街道联动

    最近在做一个省市区街道联动的功能 使用的是 Element 级联组件 现将自己的思路和问题记录一下 有对直辖市 港澳台数据的处理 大佬们有更好的建议可以留言哦 话不多说 直接上菜 先看下效果 接口数据 小伙伴们可以根据后端返回数据做相应处理
  • Java基础笔记:Collection集合框架

    Collection框架 Collection 单列集合类的根接口 用于存储一系列符合某种规则的元素 它有两个重要的子接口 分别是java util List和java util Set List的特点是元素有序 元素可重复 Set的特点是
  • C语言联合体

    一 联合体的概念 联合 union 是一个能在同一个存储空间里 但不同时 存储不同类型数据的复合数据类型 大致结构如下 n union foo 定义一个联合类型foo n q int digit q double bigfl 10 q ch
  • 浅学Linux内核MMU

    1 MMU基本知识 1 1 什么是MMU MMU是 MemoryManagementUnit 的缩写即 内存管理单元 针对各种CPU MMU是个可选的配件 MMU负责的是虚拟地址与物理地址的转换 提供硬件机制的内存访问授权 现代 CPU 的
  • Google TPU的发展历程与思考(二)

    TPU v2 与 TPU v3 相较于 TPU v1 只能用于推理 TPU v2 致力于解决训练难题 TPUv2 设计目标 训练与推理 仅仅是转变方向而已吗 TPUv2 誓要解决更难的训练任务 事实上 训练与推理的难度相差比想象的要大 1
  • Acwing 1414.牛异或

    输入样例 5 1 0 5 4 2 输出样例 6 4 5 刚开始看到这个题 我是毫无思绪 看了一下题解 https www acwing com video 2339 老师说这个是最大异或对的变形 于是我去找了一下最大异或对 看完之后我只能想