【思维构造】Vampiric Powers, anyone?—CF1847C

Vampiric Powers, anyone?---CF1847C
参考文章

这个思路完美利用了 a i a_i ai 很小的这个特点,通过异或前缀和完美地将循环数组的长度变为循环元素的范围,极快地提升了代码的效率。

思路

手推一遍"召唤"的过程可以发现,能召唤出的最大力量即 a a a 数组中连续子串中元素异或和的最大值。用代码表示就是:

cpp 复制代码
	int res = a[1];
	for (int l = 1; l <= n; l ++) {
		int now = 0;
		for (int r = l; r <= n; r ++) {
			now ^= a[r];
			res = max(res, now);
		}
	}

当然这样是一定会超时的,我们需要考虑一个更高效的方法。

观察题目可以发现, a i < 256 a_i < 256 ai<256 这个条件还没有用到,那么可以发现一个新的思路:

求 a a a 的前缀异或和数组,数组中任意两个元素异或的最大值即为所求。虽然这样也是两层循环,但每层循环的循环次数最多不过 256 256 256 次,可以通过本题。

C o d e Code Code

cpp 复制代码
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 1e5 + 10;

int n;
int a[N];

void solve() {
	cin >> n;
	map<int, int> mp;
	mp[0] = 1;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
		a[i] ^= a[i - 1];
		mp[a[i]] = 1;
	}
	
	int res = -1;
	for (auto i : mp) {
		if (i.second) {
			for (auto j : mp) {
				if (j.second) {
					res = max(res, i.first ^ j.first);
				}
			}
		}
	}
	
	cout << "         ";
	cout << res << "\n";
}

signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T = 1;
	cin >> T; cin.get();
	while (T --) solve();
	return 0;
}
相关推荐
小小de风呀14 分钟前
de风——【从零开始学C++】(四):类和对象(下)
开发语言·c++·算法
CSCN新手听安17 分钟前
【Qt】系统相关(一)内容简介,事件概念,事件的处理
开发语言·c++·qt
不想写代码的星星28 分钟前
重识 std::tuple:一个被低估的编译期异构容器
开发语言·c++
瞎折腾啥啊1 小时前
VCPKG详细使用教程
linux·c++·cmake·cmakelists
楼田莉子2 小时前
仿Muduo的高并发服务器:LoopThread模块及其ThreadPool模块
linux·服务器·c++·后端·学习
盐焗鹌鹑蛋2 小时前
【C++】模板进阶
c++
繁星蓝雨2 小时前
Qt多界面创建的优化问题(main函数或主界面中创建?)—————附带详细方法
c++·qt·架构·多界面管理
Cx330❀2 小时前
Qt 入门指南:从零搭建开发环境到第一个图形界面程序
xml·大数据·开发语言·网络·c++·人工智能·qt
蜡笔小马2 小时前
02.C++设计模式—建造者模式详解
c++
诙_3 小时前
深入理解C++设计模式
c++·设计模式