首页 > 其他分享 >AcWing 5726. 连续子序列

AcWing 5726. 连续子序列

时间:2024-06-22 21:43:23浏览次数:29  
标签:int tr sum 5726 异或 res 序列 include AcWing

5726. 连续子序列 - AcWing题库

01trie 的不错的练习题。题目说了求一段连续子序列的异或和,因为异或有结合律,所以我们可以直接预处理一个前缀异或和,即 \(a[l,r] = sum[r] \operatorname {xor} sum[l - 1]\)。然后求一段异或和就变成了求任意两个 \(sum\) 的异或和,而这就可以用到 01trie。而这不是求最大值,是统计数量。在 trie 上,如果此路径上异或和大于 \(x\) 那么之后就没必要再走了,直接加上这个子树上节点数量即可。有一说一,搞了我半天。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

typedef long long LL;

const int N = 1000010 * 32;

int n, m;
int tr[N][2], idx, cnt[N];
int sum[N];
LL maxv; // 注意开longlong 总共数量可能会有 10 ^ 12 个

void insert(int x)
{
    int p = 0;
    for (int i = 29; i >= 0; i -- )
    {
        int s = x >> i & 1;
        if (tr[p][s] == 0) tr[p][s] = ++ idx;
        p = tr[p][s];
        cnt[p] ++ ;
    }
}

int query(int x)
{
    int p = 0, res = 0;
    for (int i = 29; i >= 0; i -- )
    {
        int s = x >> i & 1, v = m >> i & 1;
        if (!v) res += cnt[tr[p][s ^ 1]];
        p = tr[p][v ^ s];
        if (p == 0) break;
    }
    res += cnt[p];
    return res;
}


int main()
{
    cin >> n >> m;
    
    
    insert(0); // 边界上一段也要统计。
    for (int i = 1; i <= n; i ++ ) 
    {
        scanf("%d", &sum[i]);
        sum[i] ^= sum[i - 1]; // 异或前缀和,实际上用一个 s 变量就够了,或者滚动数组
        
        maxv += query(sum[i]);
        insert(sum[i]);
    }
    
    cout << maxv << endl;
    
    return 0;
}

标签:int,tr,sum,5726,异或,res,序列,include,AcWing
From: https://www.cnblogs.com/blind5883/p/18262759

相关文章

  • Day 28 | 491.递增子序列 、46.全排列、 47.全排列 II
    491.递增子序列本题和大家刚做过的90.子集II非常像,但又很不一样,很容易掉坑里。https://programmercarl.com/0491.递增子序列.html视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中至少有两......
  • 树的序列化笔记
    \(dfs\)序以\(DFS\)(先根遍历)⾸次访问顺序将节点重新排列。特征:每个顶点在序列中出现恰好⼀次(废话)⽗节点排在⼦节点前⾯(废话)每棵⼦树都占据序列的⼀个区间欧拉序记录\(DFS\)递归/回溯时依次经过的所有点。特征:每个点出现次数=度数(根多1次)相邻点深度差1\(LCA(x,y)=\)......
  • LeetCode 2542. 最大子序列的分数(贪心、小顶堆)
    2542.最大子序列的分数思路:先对nums2按降序排列,然后遍历nums2的最小值,同时在区间[0,i]中选中k个最大的nums1即可。然后找出最大的ansclassSolution{public:typedefpair<int,int>PII;longlongmaxScore(vector<int>&nums1,vector<int>&nums2,intk)......
  • 基于时间卷积门控循环单元融合注意力机制TCN-GRU-Attention实现负荷多变量时间序列预
    %导入数据load(‘data.mat’);%请替换为你的数据文件名%数据应该是一个矩阵,每一行代表一个时间步,每一列代表一个特征或变量%划分训练集和测试集trainRatio=0.8;%训练集比例trainSize=round(trainRatio*size(data,1));trainData=data(1:trainSize,......
  • 《双序列拓展》
    描述称某个序列 B={b1​,b2​,⋯,bn​} 是另一个序列 A={a1​,a2​,⋯,am​} 的拓展当且仅当存在正整数序列 L={l1​,l2​,⋯,lm​},将 ai​ 替换为 li​ 个 ai​ 后得到序列 B。例如,{1,3,3,3,2,2,2} 是 {1,3,3,2} 的拓展,取 L={1,1,2,3} 或 {1,2,1,3};而 {......
  • 树形DP——AcWing 285. 没有上司的舞会
    目录树形DP定义运用情况注意事项解题思路AcWing285.没有上司的舞会 题目描述运行代码代码思路改进思路改进代码(AI)其它代码代码思路树形DP定义树形DP是在树上进行的动态规划。它利用树的结构特点,通过递归或迭代的方式,在每个节点上进行状态计算和转移,以求......
  • 数位统计DP——AcWing 338. 计数问题
    数位统计DP定义数位DP(DigitalDP)是一种用于解决与数字的数位相关问题的动态规划算法。它将数字的每一位看作一个状态,通过转移状态来计算满足特定条件的数字个数或其他相关统计信息。运用情况统计满足特定条件的数字个数,例如在给定范围内有多少个数字满足某些数位特征。计算......
  • 时间序列预测评价指标
    评价指标时间序列预测评价指标均方误差(MeanSquaredError,MSE)简要介绍:MSE是实际值与预测值之间差的平方的平均值。它是衡量预测精度的常用方法,适用于连续变量。优点:易于计算,对大误差有较高的敏感性。缺点:受异常值影响较大,不具有尺度无关性质。公式:......
  • 序列化和反序列化pickle和json 模块
    importpicklehello='helloworld'data=pickle.dumps(hello)#pickle.dumps把任意对象序列化成一个bytes(字节数)print(data)data1=pickle.loads(data)#pickle.loads将字节数反序列化print(data1)importjsondata={'hello':123,'nihao':'word&......
  • 数字信号处理作业 序列的卷积 实现 + MATLAB 源码
    实现有限长序列的基本运算(包括:加法、乘法、累加、移位、翻褶、抽取、插值、卷积和),并以GUI的形式将这些运算整合起来,使用者可通过向GUI输入任意有限长序列得到对应的运算结果。加法:对两个序列中对应位置的元素进行相加,得到一个新的序列,要求两个序列的长度......