E题

牛牛数数

https://ac.nowcoder.com/acm/contest/10845/E

E题
用线性基和二分来写
找到第一个大于k的数的位置
再用总数减一下就可以了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll d[100],p[100],k,a;
int n,cnt;
bool f=0;
void insert(ll x){
    for(int i=62;i>=0;i--)
    if(x&(1ll<<i))
    {
        if(d[i])x^=d[i];
        else{d[i]=x;return;}
    }
    f=1;
}
void rebuild(){
    for(int i=62;i>=1;i--)
    for(int j=i-1;j>=0;j--)
    if(d[i]&(1ll<<j))d[i]^=d[j];
    for(int i=0;i<=62;i++)
    if(d[i])p[cnt++]=d[i];
}
ll getkth(ll k){
    if(f)--k;
    if(!k)return 0;
    if(k>=(1ll<<cnt))return -1;
    ll ans=0;
    for(int i=0;i<cnt;i++)
    if(k&(1ll<<i))ans^=p[i];
    return ans;
}
int main()
{
    scanf("%d%lld",&n,&k);
    for(int i=1;i<=n;i++)scanf("%lld",&a),insert(a);
    rebuild();
    ll l=1,r=(1ll<<cnt)+f-1;
    while(l<r)
    {
        ll m=l+r>>1;
        if(getkth(m)>k)r=m;
        else l=m+1;
    }
    cout<<(1ll<<cnt)-l+f<<endl;//由于线性基得不到0所以f用来表示0存不存在
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-20 14:01
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-19 17:02
鼠鼠深知pdd的强度很大,但是现在没有大厂offer,只有一些不知名小厂我是拒绝等秋招呢,还是接下?求大家帮忙判断一下!
水中水之下水道的鼠鼠:接了再说,不图转正的话混个实习经历也不错
投递拼多多集团-PDD等公司10个岗位 >
点赞 评论 收藏
分享
qq乃乃好喝到咩噗茶:院校后面加上211标签,放大加粗,招呼语也写上211
点赞 评论 收藏
分享
06-13 10:15
门头沟学院 Java
想去夏威夷的大西瓜在午休:我也是27届,但是我现在研一下了啥项目都没有呀咋办,哎,简历不知道咋写
点赞 评论 收藏
分享
评论
5
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务