遂宁市网站建设_网站建设公司_云服务器_seo优化
2025/12/23 15:40:14 网站建设 项目流程

亦或,线性基,构造

题意

给出一个序列\(\{a_i\}\),试将其划分为尽可能多的非空子段,满足每一个元素出现且仅出现在其中一个子段中,且在这些子段中任取若干子段,它们包含的所有数的异或和不能为\(0\)

\(1 \leq n \leq 2*10^5\)\(0 \leq a_i \leq 10^9\)

题解

很明显,这个序列的若干个前缀亦或和亦或起来不能为零,也就是要满足构成一个线性基。

直接插入并求出大小即可。

代码

#include<bits/stdc++.h>
using namespace std;
const int Maxn=2e5+10;
int n,lst;
int p[62],sz;
bool insert(int x)
{for(int i=60;i>=0;i--) if((x>>i)&1){if(!p[i]) return p[i]=x,1;x^=p[i];}return 0;
}
signed main()
{cin>>n;for(int i=1;i<=n;i++){int x; cin>>x; lst^=x;if(insert(lst)) sz++;}cout<<(lst?sz:-1)<<endl;return 0;
}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询