【思维构造】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;
}
相关推荐
-To be number.wan6 小时前
C++ 赋值运算符重载:深拷贝 vs 浅拷贝的生死线!
前端·c++
XXYBMOOO8 小时前
内核驱动开发与用户级驱动开发:深度对比与应用场景解析
linux·c++·驱动开发·嵌入式硬件·fpga开发·硬件工程
SoveTingღ11 小时前
【问题解析】我的客户端与服务器交互无响应了?
服务器·c++·qt·tcp
温宇飞12 小时前
内存异常
c++
挖矿大亨14 小时前
C++中深拷贝与浅拷贝的原理
开发语言·c++·算法
Bruce_kaizy14 小时前
c++图论——生成树之Kruskal&Prim算法
c++·算法·图论
雾岛听蓝15 小时前
C++:模拟实现string类
开发语言·c++
XFF不秃头16 小时前
力扣刷题笔记-合并区间
c++·笔记·算法·leetcode
编程之路,妙趣横生16 小时前
STL(七) unordered_set 与 unordered_map 基本用法 + 模拟实现
c++
寂柒16 小时前
c++--
c++