题意:给定n个数,让你给出一个数,使得n个数与给出的数异或后得到的数的二进制表示中1的数量相同

题解:考虑暴搜2^30去找答案,显然不可接受

显然可以发现,这是一个经典的meet in the middle模型,直接套用然后hash一下即可

设前15位异或完之后1的个数为ai,那么差分一下得

a1  a2-a1  a3-a2  a4-a3  ......

设后15位异或之后1的个数为bi,那么查分一下得

b1  b2-b1  b3-b2  b4-b3  ......

差分完之后表示的是后一个数1的个数与前一个数的区别,当所有的ai-ai-1+bi-bi-1都为0时,则表示后一个数和前一个数的1的个数相同

即a2-a1=-(b2-b1)

所以只要将后15位得到的bi数组取相反数即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<map>
#define ll long long
#define mod 145141247483647
using namespace std;
int bit[],a[],b[];
int n;
map<ll,int> fl;
map<ll,int>::iterator I;
const int T=(<<)-;
int main()
{
for(int i=;i<=;i++)bit[i]=bit[i>>]+(i&);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)b[j]=(a[j]>>)^i;
for(int j=n;j>;j--)b[j]=bit[b[j]]-bit[b[j-]]+;
ll t=;
for(int j=;j<=n;j++)t=(t*+b[j]+mod)%mod;
fl[t]=i;
}
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)b[j]=(a[j]&T)^i;
for(int j=n;j>;j--)b[j]=-bit[b[j]]+bit[b[j-]]+;
ll t=;
for(int j=;j<=n;j++)t=(t*+b[j]+mod)%mod;
I=fl.find(t);
if(I!=fl.end())
{
return !printf("%d\n",((*I).second<<)+i);
}
}
return !printf("-1");
}

最新文章

  1. 关于war包 jar包 ear包 及打包方法
  2. ASP.net状态服务器使用
  3. wifi-mac
  4. K2 BPM+Microsoft Dynamics CRM,妥妥的~
  5. 苏泊尔借助微软CRM提升客户满意度
  6. mapred和mapreduce
  7. setTimeout setInterval 区别 javascript线程解释
  8. mongodb地理空间计算逻辑
  9. dom方法读取xml(不常用)
  10. JVM GC知识回顾
  11. 重装Win10系统的非常简单的操作教程
  12. day18_雷神_django第一天
  13. Number Sequence POJ - 1019 递推 数学
  14. XamarinAndroid组件教程RecylerView自定义适配器动画
  15. centos7配置apache服务
  16. linux 三剑客之awk
  17. 四、vue语法补充
  18. django multidb --- router
  19. Jmeter Connect to Cassandra
  20. css调用方式的方法

热门文章

  1. VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
  2. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_4_缓冲流的效率测试_复制文件
  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_3_BufferedInputStream_字节缓冲
  4. object数据类型
  5. spring mvc 接受数组
  6. 重拾SQL——表中索值
  7. ABI与API的区别
  8. 史上最全的ORACLE基础教程
  9. 20171110面试笔记 服务器端程序员+C/C++开发
  10. [常用类]Scanner 类