【思维构造】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;
}
相关推荐
xiaolang_8616_wjl7 小时前
c++文字游戏_闯关打怪2.0(开源)
开发语言·c++·开源
夜月yeyue7 小时前
设计模式分析
linux·c++·stm32·单片机·嵌入式硬件
无小道8 小时前
c++-引用(包括完美转发,移动构造,万能引用)
c语言·开发语言·汇编·c++
FirstFrost --sy9 小时前
数据结构之二叉树
c语言·数据结构·c++·算法·链表·深度优先·广度优先
Tanecious.10 小时前
C++--map和set的使用
开发语言·c++
Yingye Zhu(HPXXZYY)10 小时前
Codeforces 2021 C Those Who Are With Us
数据结构·c++·算法
liulilittle11 小时前
LinkedList 链表数据结构实现 (OPENPPP2)
开发语言·数据结构·c++·链表
无聊的小坏坏11 小时前
三种方法详解最长回文子串问题
c++·算法·回文串
山河木马11 小时前
前端学习C++之:.h(.hpp)与.cpp文件
前端·javascript·c++
2401_8919573111 小时前
list的一些特性(C++)
开发语言·c++