本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

 

描述

对于给定的n和m以及a1,...,ana1,...,an,请你计算:

 s=∑ni=1max1≤j≤min{m,n−i+1}{ai⊕ai+1⊕...⊕ai+j−1} }

s=∑i=1nmax1≤j≤min{m,n−i+1}{ai⊕ai+1⊕...⊕ai+j−1} 

格式

输入格式

第1行为空格分隔的n和m。

第2行为空格分隔的$${a1,...,ana1,...,an}$$

输出格式

一个数字,为计算结果s(只保留低31位即可)。

样例1

样例输入1[复制]

 
10 5
1 2 3 4 5 6 7 8 9 10

样例输出1[复制]

 
92

限制

1≤m≤n≤5×1051≤m≤n≤5×105

∀i∈[1,n],1≤ai≤231−1∀i∈[1,n],1≤ai≤231−1

时间

前三个测试点 1s

剩下的 2s

空间

384MiB

正解:trie+贪心

解题报告:

  异或类的题目,显然拆成一位一位的会好做多了。记得以前我出的题目里面出过一道类似的...

  按每一位是1或0建一棵trie树,然后因为每次的查询有范围限制,所以可以看做是在trie上动态插入元素或者删除元素,只需要维护一个每个结点的经过次数,就可以处理这个问题。

  插入就很简单了。查询呢?对于sum[i-1](sum数组为前缀异或和)在trie上查询,每一位尽可能选择不同,如果不存在不同的就只能选择这一位选择相同,那么就没有贡献。如果可以不同就继续顺着trie树上走,并加入贡献。

  插入和删除的话就把经过的结点经过次数++或者--。

 //It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
const int inf = (<<);
const int MAXN = ;
int n,m,a[MAXN],sum[MAXN];
int tr[MAXN][],ci[MAXN],cnt;
LL ans; inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
}
inline void insert(int x){
int u=,num; ci[u]++;
for(int i=;i>=;i--) {
num=(x>>i)&; if(!tr[u][num]) tr[u][num]=++cnt;
u=tr[u][num]; ci[u]++;
}
}
inline void del(int x){ int u=,num; ci[u]--; for(int i=;i>=;i--) { num=(x>>i)&; u=tr[u][num]; ci[u]--; } }
inline void query(int x){
int u=,num; int now_ans=;
for(int i=;i>=;i--) {
num=(x>>i)&;
if(!tr[u][num^] || ci[tr[u][num^]]==) u=tr[u][num];
else u=tr[u][num^],now_ans+=(<<i);
}
ans+=now_ans;
} inline void work(){
n=getint(); m=getint(); for(int i=;i<=n;i++) a[i]=getint(),sum[i]=sum[i-]^a[i]; cnt=;
int nowl=; while(nowl<m) insert(sum[nowl]),nowl++;
for(int i=;i<=n;i++) {
if(nowl<=n) insert(sum[nowl]),nowl++;
query(sum[i-]);
del(sum[i]);
}
LL MOD=(1LL<<); ans%=MOD;
printf("%lld",ans);
} int main()
{
work();
return ;
}

vijos2001 xor-sigma的更多相关文章

  1. [51nod1310]Chandrima and XOR

    有这样一个小到大排列的无穷序列S:1, 2, 4, 5, 8......,其中任何一个数转为2进制不包括2个连续的1.给出一个长度为N的正整数数组A,A1, A2......An记录的是下标(下标从1 ...

  2. BZOJ-2337 XOR和路径(HNOI2011)概率DP+概率的线性叠加

    题意:给出n个点和m条边,每条边有权值wi,从1出发,每次等概率选一条出边走,直到终点n停止,得到的值是路径所有边的异或和.问异或和期望. 解法:这道题非常有意思!首先比较直观的想法就是dp[x]代表 ...

  3. [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字

    Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...

  4. 二分+DP+Trie HDOJ 5715 XOR 游戏

    题目链接 XOR 游戏 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  5. BZOJ 2115 【Wc2011】 Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  6. xor和gates的专杀脚本

    前段时间的一次样本,需要给出专杀,应急中遇到的是linux中比较常见的两个家族gates和xor. 首先是xor的专杀脚本,xor样本查杀的时候需要注意的是样本的主进程和子进程相互保护(详见之前的xo ...

  7. Codeforces617 E . XOR and Favorite Number(莫队算法)

    XOR and Favorite Number time limit per test: 4 seconds memory limit per test: 256 megabytes input: s ...

  8. Xor && 线性基练习

    #include <cstdio> #include <cstring> ; ; int cnt,Ans,b,x,n; inline int Max(int x,int y) ...

  9. BC之Claris and XOR

    http://acm.hdu.edu.cn/showproblem.php?pid=5661 Claris and XOR Time Limit: 2000/1000 MS (Java/Others) ...

  10. 异或链表(XOR linked list)

    异或链表(Xor Linked List)也是一种链式存储结构,它可以降低空间复杂度达到和双向链表一样目的,任何一个节点可以方便的访问它的前驱节点和后继结点.可以参阅wiki 普通的双向链表 clas ...

随机推荐

  1. mongodb分布式查询

    分布式查询:mongodb的分布式模型分为replica set和sharded cluster. sharded集群中将read根据sharding key(分片键)转发到指定的shard节点,re ...

  2. 转:用WCAT进行IIS压力测试

    Microsoft的Web容量分析工具(WCAT) 是测试你的客户-服务器网络配置的必备工具.这个工具在你的网络上对多种工作量的场景进行仿真,允许你确定你的网络和服务器的最佳配置.WCAT是专门为 评 ...

  3. linux传输大文件

    http://dreamway.blog.51cto.com/1281816/1151886 linux传输大文件

  4. struts2: 通过流输出实现exce导出

    参考下面代码,在Action中加一个方法: // 导出excel public String excel() throws Exception { StringBuffer excelBuf = ne ...

  5. git by example

    记一次回滚操作 路人甲让我修改一个bug,我在develop下修改了 路人甲让我push到releae/sdk0.7分支上 我本地操作切换到release分支并合并develop上的修改: git c ...

  6. 创建pathing jar

    pathing jar是一个特殊的jar: 该jar文件只包含manifest.mf文件 该manifest文件只包含Class-Path,列出了所有需要真正加到classpath中的jar,或者di ...

  7. svn: Checksum mismatch for 'C:\Documents and Settings\Admin\workspace\pics5\src\baolintest\.svn\text-base\test1.java.svn-base'; expected: '034cc715af5

    出现这个问题解决如下: 比如问题文件为\workspace\pics5\src\baolintest\test.java文件,则 1.把在工程根\workspace\pics5\src\baolint ...

  8. opencv6.2-imgproc图像处理模块之图像尺寸上的操作及阈值

    接opencv6.1-imgproc图像处理模块之平滑和形态学操作,顺带说一句在opencv中的in-place操作就是比如函数的输入图像和输出图像两个指针是相同的,那么就是in-place操作了.比 ...

  9. mSites and Smarty

    目前的页面实现方式是需要向后台请求接口,返回 JSON 数据,动态拼接字符串塞进 DOM 中(innerHTML).考虑用 Smarty 生成静态页面,可以在后台用 PHP 得到数据,字符串拼接,然后 ...

  10. WampServer下如何实现多域名配置(虚拟域名配置)

    之前在学习跨域的时候,我写过一篇叫做WampServer下使用多端口访问的文章,默认的 localhost 采用的是 80 端口,能使用多端口访问的核心是得新建一个端口,也就是新建一个 http 服务 ...