亦或,线性基,构造
题意
给出一个序列\(\{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;
}