算法沉淀第十一天(序列异或)

目录

引言:

序列异或

题意分析​编辑

逻辑梳理

代码实现

AC码

代码讲解

结语:


引言:

时隔多日,我又来沉淀算法了,今天我们来讲一下我的训练题,这道题在没有我学长的讲解帮助下,我还真完全想不到有这么新颖的解法,太通透了

那么,话不多说,我们就进入今天的算法讲解--------------------->


序列异或

按照惯例,我们先来看题目

题意分析

这个题就是给你一个数组,然后四个不同下标的数为一组,如果一组数异或下来的结果是0,那么这个数就是符合条件的,问你有几组符合条件的数,输出即可

那么,题目分析完了,我们进入逻辑梳理环节


逻辑梳理

这题的数据范围给的很低,但是如果通过四层循环来找毋庸置疑会超时,这个时候我们可以通过异或的性质(a^a=0),将一组4个元素的数拆成2组2个元素的数,只要这俩组数异或的结果一样的话,那么就找到一组数了

那么,我们可以通过循环来找2个为一组的数据,那么 ,我们可以用一个数组来统计异或结果为x时候的组数有几组,将这个几放在下标为x的位置

上面那个数组是预处理到第三个下标前的数,然后再通过第三个下标和第四个下标异或的结果的下标上的该数组的元素就是在第三个下标和第四个下标为固定时候满足的组数的数量,然后更新结果,然后再从开始位置到当前第三个下标位置的所有元素分别和当前第三个下标的元素进行异或的结果作为下标的数组元素值++,因为下一次循环时候,第三个下标位置就变成了之前第三个下标位置的下一位

直接讲的话会很抽象,因为我也是第一次接触这种高级更新优化法,那么,我们通过代码来讲解


代码实现

AC码很短,但是思路特别巧妙,这里先放AC码,如下

AC码

cpp 复制代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;

int a[5010];
long long t[2000010];

void solve()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	long long ans = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j = i + 1; j <= n; j++)
		{
			ans += t[a[i] ^ a[j]];
		}
		for (int j = 1; j < i; j++)
		{
			t[a[i] ^ a[j]]++;
		}
	}
	cout << ans << endl;
	return;
}

int main()
{
	solve();
	return 0;
}

代码讲解

那么,我们通过上面的代码来讲讲具体实现方式,

首先,t这个数组表示的就是组数,i下标的元素表示异或结果是i的组数(这个组数指的是2个一组的组数)

然后,i表示的是第三个下标,然后我们先不看第一个for循环,我们看下面那个for循环,那个for循环是从数组的第一个元素开始,然后到第三个下标之前,这是在算第一个下标和第二个下标做的组,第一个下标是就是那个循环,第二个下标就是现在循环的i,因为这边循环迭代完再++后,第三个下标就到后面的一位去了。

那么,接下来我们来看第一个for循环 ,第一个for循环就是在更新ans的值了,ans的值就是答案,在第一个for循环里的就是第三个下标和第四个下标,然后第三个下标和第四个下标异或得到的值跟先前能异或出这个值的组相异或就可以得到0,所以只需要加上先前能异或出这个值的组的数量就可以了,也就是下标为这个值得t的元素

那么,为什么第一个循环放在第二个循环前面呢,因为第二个循环执行时候相当于i这个位置的下标已经是作为第二个下标来进行更新了,所以要放在第一个循环后面

那么,这道题的大体代码分析就是这个样子


结语:

今日算法讲解到此结束啦,希望对你们有所帮助,谢谢观看,如果觉得不错可以分享给朋友哟。有什么看不懂的可以评论问哦,

相关推荐
地平线开发者4 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮4 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者5 小时前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考5 小时前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx8 小时前
CART决策树基本原理
算法·机器学习
Wect9 小时前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱9 小时前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法
肆忆_12 小时前
# 用 5 个问题学懂 C++ 虚函数(入门级)
c++
不想写代码的星星16 小时前
虚函数表:C++ 多态背后的那个男人
c++
Gorway16 小时前
解析残差网络 (ResNet)
算法