Edu12 Beautiful Subarrays --- 题解

news/2024/7/24 6:51:00 标签: 算法

 Beautiful Subarrays:

题目大意:

  思路解析:

要找到一个区间并且区间的l--r里面所有的元素异或值大于等于k,称这样的数组是优美子数组,问优美子数组有多少个。

[L,R] 的数组异或和等价于 (a1,a2,a3,....aL-1) ^ (a1,a2,a3,a4,....aR)那么发现我们可以用前缀和的思想,来找到一个前缀使得[L,R]是优美子数组,发现这种二进制的寻找可以利用字典树实现,然后每次在这样的字典树插入前缀。

寻找时,如果加上当前位就能大于等于k,那么我们并不用关心以后的情况了,直接加上满足能加上当前位的所有情况即可,这里需要利用一个标记位进行预处理。

代码实现:


#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 3e7 + 5;
int ch[maxn][2];
int tag[maxn];
int tot = 0;
ll ans = 0;
int k;
void insert(int x){
    int p = 0;
    tag[p]++;
    for (int i = 30; i >= 0; i--) {
        int c = (x >> i) & 1;
        if (ch[p][c] == 0) ch[p][c] = ++tot;
        p = ch[p][c];
        tag[p]++;
    }
}

void get(int x){
    int cur = 0;
    int p = 0;
    for (int j = 30; j >= 0; j--) {

        int c = (x >> j) & 1;
        if ((cur | (1 << j)) >= k){
            ans += ch[p][c ^ 1] != 0 ? tag[ch[p][c ^ 1]] : 0;
            p = ch[p][c];
        }else {
            cur |= (1 << j);
            p = ch[p][c ^ 1];
        }
        if (p == 0) break;
    }
    if (cur >= k) ans += p != 0 ?tag[p]:0;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    memset(ch, 0, sizeof(ch));
    memset(tag, 0, sizeof(ch));
    int n;
    cin >> n >> k;
    int s = 0;
    insert(s);
    for(int i = 0; i < n; ++i){
        int num;
        cin >> num;
        s ^= num;
        get(s);
        insert(s);
    }
    cout << ans << endl;
    return 0;
}


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

相关文章

AI辅助研发的技术趋势

AI辅助研发的技术进展 2024年&#xff0c;AI辅助研发领域将继续迎来技术突破和创新。深度学习、强化学习和生成模型等技术将在研发中发挥越来越重要的作用。深度学习在数据分析和模式识别方面表现突出&#xff0c;可用于加速药物发现、材料设计和产品优化等任务。强化学习则在…

GPT实战系列-LangChain实现简单链

GPT实战系列-LangChain实现简单链 LangChain GPT实战系列-LangChain如何构建基通义千问的多工具链 GPT实战系列-构建多参数的自定义LangChain工具 GPT实战系列-通过Basetool构建自定义LangChain工具方法 GPT实战系列-一种构建LangChain自定义Tool工具的简单方法 GPT实战系…

蓝桥杯嵌入式省赛模板构建——UART接收

单片机接收电脑发送的数据 程序设计步骤 1.配置USART1的PA9,PA10为串口收发引脚 2.配置USART的波特率、奇偶校验位、停止位、时钟 3.勾选NVIC Setting中的使能USART1的中断 4.将source生成的.c和.h文件移植到目标工程 4.1 USART初始化部分需要移植NVIC初始化内容 4.2 在…

通信总线协议之CAN-FD协议详解

文章目录 通信总线之CAN-FD总线协议详解1. CAN-FD 简介1.1 什么是CAN FD1.2 CAN FD的特点 2. CAN-FD总线协议2.1 帧起始2.2 仲裁段2.3 控制段2.4 数据段2.5 CRC段2.6 ACK段2.7 帧结束 3. 如何从传统的CAN升级到CAN FD 通信总线之CAN-FD总线协议详解 1. CAN-FD 简介 1.1 什么是…

SpringBoot中定时任务、corn表达式

SpringBoot中定时任务、corn表达式 corn表达式网站&#xff1a;https://cron.qqe2.com/ 方法上加上Scheduled(cron表达式) 启动类上加上EnableScheduling 示例 启动类上 启动类加上EnableScheduling开启定时任务。 SpringBootApplication EnableScheduling public class…

PiflowX-TopN组件

TopN组件 组件说明 按列排序的N个最小值或最大值。 有界性 batch streaming 计算引擎 flink 组件分组 common 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子column_listcolumn_list“*”无否查…

ChatGPT引领智能对话:微信小程序的新潮玩法

1.引言 ChatGPT是由OpenAI开发的基于深度学习的自然语言处理模型&#xff0c;它在人工智能领域具有重要的影响力。ChatGPT基于大规模的文本数据进行训练&#xff0c;能够生成高质量的自然语言文本&#xff0c;包括对话、文章等。它的影响力主要体现在以下几个方面&#xff1a;…

linux系统docker历史以及对虚拟机的区别

docker历史及与容器的区别 docker容器历史对paas降维打击容器和虚拟机的区别容器应用场景 docker容器历史 容器概念始于 1979 年提出的 UNIX chroot&#xff0c;它是一个 UNIX 操作系统的系统调用&#xff0c;将一个进程及其子进程的根目录改变到文件系统中的一个新位置&#…