标签:练习赛 牛牛 ll ans 76 int ch maxn printf
题目链接:https://ac.nowcoder.com/acm/contest/10845/E
线性基:https://oi.men.ci/linear-basis-notes/
二分后转化成线性基求第 \(k\) 大
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 101;
const int maxl = 62;
int T, n, m, q;
ll K;
int cnt;
struct LinearBasis{
ll a[maxn + 10];
int b[maxn];
LinearBasis(){
fill(a, a + maxn + 1, 0);
}
void insert(ll t){
for(int j = 62 ; j >= 0 ; --j){
if((t >> j) & 1){
if(a[j]){
t = t ^ a[j];
} else{
for(int k = 0 ; k < j ; ++k){
if((t >> k) & 1) t = t ^ a[k];
}
for(int k = j + 1 ; k <= 62 ; ++k){
if((a[k] >> j) & 1) a[k] = a[k] ^ t;
}
a[j] = t;
return;
}
}
}
}
}A;
bool check(ll k){
if(cnt != n) --k;
if(k > (1ll << cnt) - 1) return false;
else{
ll ans = 0;
for(int i = 0 ; i <= 62 ; ++i){
if((k >> i) & 1){
ans ^= A.a[A.b[i + 1]];
}
}
// printf("%lld\n", k, ans);
return ans <= K;
}
}
ll read(){ ll s = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); } return s * f; }
int main(){
// freopen("data.in", "r", stdin);
// freopen("my.out", "w", stdout);
n = read(), K = read();
ll x;
for(int i = 1 ; i <= n ; ++i){
x = read();
A.insert(x);
}
cnt = 0;
for(int i = 0 ; i <= 62 ; ++i){
if(A.a[i]) A.b[++cnt] = i;
}
ll tot = 1ll << cnt;
if(cnt != n) ++tot;
ll l = 0, r = 1000000000000000000;
while(l < r){
ll mid = (l + r) >> 1;
if(check(mid)){
l = mid + 1;
} else{
r = mid;
}
}
// printf("%lld\n", r);
printf("%lld\n", tot - l);
return 0;
}
标签:练习赛,牛牛,ll,ans,76,int,ch,maxn,printf 来源: https://www.cnblogs.com/tuchen/p/14320408.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。