#include<bits/stdc++.h>
#include<set>
#include<cmath>
#include<vector>
#include<numeric>
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
#define ll long long
#define pii pair<int,int>
#define debug1(x) cout<<x<<" "
#define debug2(x) cout<<x<<endl
#define rep1(a,b,c) for (int a = (b) ; a < (c) ; a+=1)
#define rep2(a,b,c) for (int a = (b) ; a < (c) ; a+=2)
const int INF = 0x3f3f3f3f;
const int maxn = 2e5+10;
const int mod = 998244353;
//埃氏筛法
vector<int> prime;
bool is_prime[maxn];
void Eratosthenes(int n) {
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= n; ++i) is_prime[i] = true;
for (int i = 2; i <= n; ++i) {
if (is_prime[i]) {
prime.push_back(i);
if ((ll)i * i > n) continue;
for (int j = i * i; j <= n; j += i) is_prime[j] = false;
}
}
}
//快速求逆元
int inv(int a){
int b = mod-2, ans = 1;
while(b){
if(b&1) ans = (ll) ans*a%mod;
a = (ll) a*a%mod;
b >>= 1;
}
return ans;
}
//回文串
void Manacher(char* str,char* new_str,int* p){
int n = strlen(str), m=0;
new_str[m++]='$'; new_str[m++]='#';
for(int i=0;i<n;i++) new_str[m++]=str[i], new_str[m++]='#';
new_str[m]='\0';
int mx=0,id=1,ans = 0;
for(int i=1;i<m;i++){
p[i] = id<mx ? min(p[2*id-i],mx-i) : 1;
while(new_str[i+p[i]]==new_str[i-p[i]]) p[i]++;
if(i+p[i]>mx) mx=i+p[i], id=i;
}
return ;
}
//快速幂
long long qpow(long long a, long long b) {
long long res = 1;
for (; b > 0; b >>= 1){
if ((b & 1) == 1) res = res * a % mod;
a = a * a % mod;
}
return res;
}
//01字典树 存前缀异或和
int trie[4*maxn][2], m=20, cur=0;
void add(int x) {
int rt = 0;
for (int i = m; ~i; --i) {// 二进制一位一位向下取
int b = (x >> i) & 1;
if (!trie[rt][b]) trie[rt][b] = ++cur;
rt = trie[rt][b];
}
}
//01字典树中查找与 x 异或后结果最大的数
int xor_max(int x) {
int rt = 0, max = 0;
for (int i = m; ~i; --i) {
int b = (x >> i) & 1;
if (trie[rt][b ^ 1]) {
rt = trie[rt][b ^ 1];
max |= 1 << i;
} else rt = trie[rt][b];
}
return max;
}
//01字典树中查找与 x 异或后结果最小的数
int xor_min(int x) {
int rt = 0, min = 0;
for (int i = m; ~i; --i) {
int b = (x >> i) & 1;
if (trie[rt][b]) rt = trie[rt][b];
else {
rt = trie[rt][b ^ 1];
min |= 1 << i;
}
}
return min;
}
int n, ans, A[maxn], lmax, lmin, rmax[maxn], rmin[maxn];
void solve(){
scanf("%d",&n); rep1(i,1,n+1) scanf("%d",&A[i]);
lmin = rmin[n + 1] = INF;lmax = rmax[n + 1] = 0;
for (int i = n, s = 0; i > 0; --i) {
add(s), s ^= A[i];
rmax[i] = max(rmax[i + 1], xor_max(s));
rmin[i] = min(rmin[i + 1], xor_min(s));
}
for (; cur; --cur) trie[cur][0] = trie[cur][1] = 0;
trie[0][1] = trie[0][0] = 0;
for (int i = 1, s = 0; i < n; ++i) {
add(s), s ^= A[i];
lmax = max(lmax, xor_max(s));
lmin = min(lmin, xor_min(s));
ans = max(ans, lmax - rmin[i + 1]);
ans = max(ans, rmax[i + 1] - lmin);
}
printf("%d", ans);
return ;
}
int main(){
ios::sync_with_stdio(false) ;
cin.tie(0);
cout.tie(0) ;
// int N; scanf("%d",&N); while(N--)
solve();
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
2023年第十四届蓝桥杯大赛软件类省赛C&C++大学C 组真题(代码&完整题解)
共14个文件
cpp:8个
exe:5个
md:1个
需积分: 5 0 下载量 84 浏览量
2024-03-29
17:32:13
上传
评论
收藏 2.3MB ZIP 举报
温馨提示
部分题解:https://blog.csdn.net/weixin_45741872/article/details/137151624 2023年第十四届蓝桥杯大赛软件类省赛C&C++研究生组真题(包含代码&完整题解) C题-三国游戏 贪心 三个国家初始人数都为0,n个事件,第i个事件若发生每个国家分别加Ai,Bi,Ci人,求最多发生几个事件使得两个国家人数之和小于第三国 D题-填充 贪心 填充01串中的?使得互不重叠的 00 和 11 子串最多,输出子串个数 E题-翻转 贪心 如果 S 中存在子串 101 或者 010,就可以将其分别变为 111 和 000,操作可以无限重复。最少翻转多少次可以把 S 变成和 T 一样。 F题-子矩阵 STL-set 求一个n*m矩阵中每一a*b子矩阵的最大最小值之积的和 G题- 互质数的个数 数论-欧拉函数,数论-快速幂 求小于a^b与a^b互质的数的个数 H题- 异或和之差 数论-位运算,字符串-字典树 n 个元素的数组 Ai。求出不相交的子段内的数的异或和的差值的最大值。 I题- 公因数匹配 J题-子树的大小
资源推荐
资源详情
资源评论
收起资源包目录
2023年第十四届蓝桥杯大赛软件类省赛C&C++大学C 组真题(代码&完整题解).zip (14个子文件)
I-公因数匹配.cpp 2KB
J-子树的大小.cpp 2KB
E-翻转.cpp 597B
H-异或和之差.exe 1.93MB
H-异或和之差.cpp 3KB
G-互质数个数.cpp 2KB
G-互质数个数.exe 1.93MB
F-子矩阵.exe 1.95MB
D-填充.exe 1.86MB
D-填充.cpp 2KB
C-三国游戏.exe 1.95MB
完整题解.md 4KB
F-子矩阵.cpp 3KB
C-三国游戏.cpp 2KB
共 14 条
- 1
资源评论
温柔说给风
- 粉丝: 9905
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功