因为数据范围是2e5级别的,所以我们考虑用异或前缀和来处理区间的异或情况。(比如说a包括b,那么我们通过异或可以知道b对于a的补区间的信息)

之后因为对任意\(a_i\)进行取反操作,会改变它和它之后的区间值(原来相等的都不相等了,原来不相等的都相等了),所以结果是我们对原先的前缀和直接取反,就可以表示对它进行取反操作之后的前缀和了。

因为不管怎么取反操作,一个位置的前缀和只有两种,那么我们显然就可以预处理出所有的值了。

然后我们可以把相同类别的放在一个map里面。(注意要避免重复,比如说010和101是一类)

之后把ans值\((==n*(n+1)/2)\)减去重复的就可以了。

因为是要求区间异或和不为0,那么转化下来的条件就是前缀和选取的两个不相等即可。

我们要求最大的个数,那么就是同一类的最好均分,用组合数算就行了。(比如说有5个010的话,分成2个010和3个101就行了)

最后注意一下要先给0类加一。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#define MAXN 200010
using namespace std;
long long ans;
int pre[MAXN];
map<int,int>m;
int n,k,x;
int main() {
scanf("%d%d",&n,&k);
m[0]++;
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
pre[i]=pre[i-1]^x;
pre[i]=min(pre[i],pre[i]^((1<<k)-1));
m[pre[i]]++;
}
ans=(long long)(n+1)*n/2;
for (map<int,int>::iterator it=m.begin();it!=m.end();it++)
{
long long x=it->second;
ans-=(long long)((x/2)-1)*(x/2)/2;
ans-=(long long)((x-x/2)-1)*(x-x/2)/2;
}
printf("%lld\n",ans);
}

最新文章

  1. python安装使用talib
  2. Azure Automation (1) 入门
  3. EntityFramework系列:SQLite.CodeFirst自动生成数据库
  4. Model和Entity Framework
  5. CSS移动
  6. iOS设置UITableView中Cell被默认选中后怎么触发didselect事件
  7. 信息处理,分而治之-- ESFramework 使用技巧
  8. Chrome Timeline的指标说明:Blocked、Connect、Send、Wait、Receive
  9. 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数
  10. 海外 App 的推送服务,试试 FCM 吧!!!
  11. 多重影分身——C#中多线程的使用三(调用方法和传参)
  12. mysql学习2
  13. android view 转Bitmap 生成截图
  14. vim简单使用教程【转】
  15. c++之__attribute__((unused))
  16. CentOS 7升级Python到3.5后yum出错
  17. .Net Core邮件发送之MailKit
  18. 【react】---context的基本使用---【巷子】
  19. cf244D. Match &amp;amp; Catch 字符串hash (模板)或 后缀数组。。。
  20. php表单提交安全方法

热门文章

  1. Redis作为缓存服务器
  2. Agile1001社区10月份活动:一张图解读企业级产品思维
  3. wamp 初始化 修改mysql密码
  4. Professional C# 6 and .NET Core 1.0 - Chapter 43 WebHooks and SignalR
  5. OSG QT
  6. Maven详解【面试+工作】 各种安装 没用
  7. 2PC之JTA原理与实现
  8. 使用Qt Installer Framework制作软件安装包
  9. python 全栈基础作业题
  10. tp5 select回显