NOIP训练营动态规划内部训练题!
Posted 信息学竞赛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP训练营动态规划内部训练题!相关的知识,希望对你有一定的参考价值。
◆ ◆ ◆
清北学堂2018年1月省选强化班模拟考试
#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;
}
sum[r]^sum[l-1]<k
对前缀异或和建trie树
假设当前是第i位,sum[r]的地i位是l
如果k的第i位为1,累加l,当前指针转到sum[r]的l^1
否则,当前指针直接转到sum[r]的l
往期精选
清北金牌教研团队助你圆梦OI!
(2)
(3)
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
(9)
关注「信息学竞赛」
看更多信息学趣闻与知识
↓↓↓
以上是关于NOIP训练营动态规划内部训练题!的主要内容,如果未能解决你的问题,请参考以下文章