【思维构造】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;
}
相关推荐
2601_954526752 小时前
【工业传感与算法实战】温漂补偿与零点抗漂破局:基于二阶多项式拟合的 C/C++ 边缘校准算法,深度拆解“压力变送器什么牌子好”的技术硬指标
c语言·c++·算法
code_pgf3 小时前
`unordered_map` 详解
c++
一拳一个呆瓜4 小时前
【STL】iostream 编程:检测提取操作产生的错误
c++·stl
稚南城才子,乌衣巷风流4 小时前
判断素数与拓展应用
c++
众少成多积小致巨5 小时前
C++ 规范参考(下)
c++
c238565 小时前
把 C++ 内存分配拆透:new 与 malloc 的三层血缘
开发语言·c++·算法
txzrxz6 小时前
最短路问题——Dijkstra 算法
数据结构·c++·算法·最短路·优先队列
noipp6 小时前
推荐题目:洛谷 P6231 [JSOI2013] 公交系统
c语言·数据结构·c++·算法·游戏·洛谷·luogu
c238567 小时前
C/C++每日一练6
c语言·c++·算法
念恒123067 小时前
网络基础
linux·网络·c++