2019西北工业大学程序设计创新实践基地春季选拔赛 g题解

链接:https://ac.nowcoder.com/acm/contest/553/G
来源:牛客网

Chino的数学很差,因此Cocoa非常担心。这一天,Cocoa准备教Chino学习异或。
众所周知,,即“异或”表示了和的二进制按位异或的结果(在C/C++中,表示了异或运算。),它的规则是如果这一位相同为0,否则为1.例如,,因为,,根据定义,它们之间的异或值是,下面是异或运算的真值表:

A B
0 0 0
0 1 1
1 0 1
1 1 0
异或还有一些非常有趣的性质,比如,,之类的。定义很简单,Chino也一下就学会了,那么现在就是作业时间啦!
开往兔子镇的火车一开始还是手摇式的木板车,所有人都在木板上做成一排,当然,就像你想的那样,旅途非常尬。如今,铁路修好了,因此人们可以坐火车来到兔子镇。有一个问题就是怎么划分车厢——大家都希望能够单独一个车厢,但在大部分情况下这是做不到的。
火车上有个乘客,坐在第位的乘客对车厢的划分有一个意愿值,我们定义一节车厢的总意愿值为这节车厢所有人意愿值的异或和,即,如果这节车厢包含了第名乘客,那么这节车厢的意愿值是.特别地,如果这节车厢只有一名乘客,那么这节车厢的意愿值就是.这个意愿值当然越高越好,但是这会让当局非常难办,因此他们确定了一个标准,的范围介于所有可能出现的意愿值之间。现在的任务就是让尽可能多的车厢的意愿值为.
题目对Chino来说太难啦,你能帮一帮Chino吗
给上题目链接


思路 找规律然后 直接贪心就完事了

*** 从1到n每个人扫一遍记录sum^a[i]的值 期间用map保存一下这个值 如果mp[sum^a[i]]的值出现了 那么在这个序列中一定有能够和k异或等于0的值
比如 A1 xor A2 xor A3 xor A4 = x 且A1 xor A2 xor A3 xor A4 xor A5 xor A6 xor K = x 那么有x xor A5 xor A6 xor K = x 所以A5 xor A6 xor K = 0,那么这个序列就是满足条件的 一旦满足条件就ans就++ 更新一下mp 这就是贪心了 注意mp[0] = 1;
代码
#include
#include

using namespace std;

const int maxn = 500000+10;

int a[maxn];

map<int,int> mp;

int main()
{
int n,k;
cin>>n>>k;
mp.clear();
for(int i = 0; i < n ;i++)
{
cin>>a[i];
}
int sum = 0,ans = 0;
mp[0] = 1;
for(int i = 0; i < n; i++)
{
sum^=a[i];
if(mp[sum^k])
{
ans++;
mp.clear();
sum = 0;
mp[0] = 1;
}
else
mp[sum] = 1;
}
cout<<ans<<endl;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值