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

【最大异或和——可持久化Trie】

题目

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 6e5+10; //注意这里起始有3e5,又可能插入3e5
const int M = N * 25;

int rt[N], tr[M][2]; //根,trie
int idx, cnt, br[M]; //根分配器,点分配器,点的相对版本
char op[2];
int n, m, s;

void insert(int v)
{
    rt[++idx] = ++cnt; //创建新根
    
    int x = rt[idx-1]; //前一个版本
    int y = rt[idx]; //当前版本
    for(int i = 23; i >= 0; i--)
    {
        int j = v >> i & 1; //提取每一位
        tr[y][!j] = tr[x][!j]; //继承不同位值的点
        tr[y][j] = ++cnt; //创建相同位值的点
        x = tr[x][j], y = tr[y][j]; //跳
        br[y] = br[x]+1; //声明所创建的相同位值得点为brand-new
    }
}
int query(int l, int r, int v) //选择版本l-1和r
{
    int retv = 0;
    
    int x = rt[l-1];
    int y = rt[r];
    for(int i = 23; i >= 0; i--)
    {
        int j = v >> i & 1;
        if(br[tr[y][!j]] > br[tr[x][!j]]) //若所求版本不一致,认定可行
        {
            y = tr[y][!j];
            x = tr[x][!j];
            retv += 1 << i;
        }
        else //若所求版本一致,认定冲突
        {
            y = tr[y][j];
            x = tr[x][j];
        }
    }
    
    return retv;
}

int main()
{
    insert(0);
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i++)
    {
        int x;
        scanf("%d", &x);
        s ^= x;
        insert(s);
    }
    for(int i = 1; i <= m; i++)
    {
        int l;
        scanf("%s%d", op, &l);
        
        if(op[0] == 'A')
            s ^= l, insert(s);
        else if(op[0] == 'Q')
        {
            int r, x;
            scanf("%d%d", &r, &x);
            printf("%d\n", query(l, r, s ^ x));
        }
    }
}

相关文章:

  • 设计模式-桥接模式
  • C语言文件管理详解(上)
  • 下拉菜单+DoTween插件
  • 基于ssm图文印务交互系统小程序(源码+lw+部署文档+讲解),源码可白嫖!
  • Docker 使用指南
  • Django Rest Framework 创建纯净版Django项目部署DRF
  • 每日一题——二叉树的三种中序遍历方法
  • C语言基础要素(017):退出条件循环:do-while
  • Qt 实现波浪填充的圆形进度显示
  • 谈谈 undefined 和 null
  • SAP(第四周)
  • NebulaGraph3.3.0部署与配置
  • 基于运动电商虚拟数据的商业洞察与分析
  • 【Mac】安装 Parallels Desktop、Windows、Rocky Linux
  • Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(一)
  • 【Json—RPC框架】:宏定义不受命名空间限制,续行符的错误使用造成的bug
  • 计算机组成原理试题六
  • 正则表达式:贪婪匹配与非贪婪匹配
  • [贪心算法] 摆动序列
  • 佰泰盛世公司推出最新低成本的DSP功放音箱解决方案
  • 4月金融数据前瞻:受去年低基数因素影响,社融增量有望同比大幅多增
  • 14岁女生瞒报年龄文身后洗不掉,法院判店铺承担六成责任
  • 复旦大学文科杰出教授裘锡圭逝世,享年90岁
  • 迪拜金融市场CEO:2024年市场表现出色,超八成新投资者来自海外
  • 第1现场 | 印巴冲突:印50多年来首次举行大规模民防演习
  • 秦洪看盘|受阻回落,蓄积新做多能量