期望得分:100+100+40=240

实际得分:100+100+20=220

 

T1

清北学堂2018年1月省选强化班模拟考试1

 

sum[r]^sum[l-1]<k

对前缀异或和建trie树

假设当前是第i位,sum[r]的地i位是l

如果k的第i位为1,累加l,当前指针转到sum[r]的l^1

否则,当前指针直接转到sum[r]的l

#include<cstdio>
#include<iostream>

using namespace std;

typedef long long LL;

#define N 100001

int bit[31];

int tr[N*30][2],sum[N*30];

int k;

int tot=1,root=1;

LL ans;

void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); }
}

void insert(int x)
{
    int now=root;
    bool j;
    for(int i=30;i>=0;--i)
    {
        j=x&bit[i];
        if(!tr[now][j]) tr[now][j]=++tot;
        now=tr[now][j];
        sum[now]++;
    }
}

void query(int x)
{
    int now=root;
    bool l,r;
    for(int i=30;i>=0;--i)
    {
        if(!now) return;
        l=x&bit[i];
        r=l^1;
        if(k&bit[i])
        {
            ans+=sum[tr[now][l]];
            now=tr[now][r];
        }
        else now=tr[now][l];
    }
}

int main()
{
    freopen("bit.in","r",stdin);
    freopen("bit.out","w",stdout);
    bit[0]=1;
    for(int i=1;i<=30;++i) bit[i]=bit[i-1]<<1;
    int n,x;
    read(n); read(k);
    insert(0);
    int pre=0;
    for(int i=1;i<=n;++i)
    {
        read(x);
        pre^=x;
        query(pre);
        insert(pre);
    }
    cout<<ans;
}
View Code

相关文章:

  • 2021-09-28
  • 2021-10-20
  • 2021-08-28
  • 2022-12-23
  • 2022-12-23
  • 2021-05-03
  • 2021-08-28
  • 2021-11-01
猜你喜欢
  • 2021-06-09
  • 2022-02-23
  • 2021-07-16
  • 2022-01-08
  • 2021-07-22
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案