【CF1257F】Make Them Similar【meet in the middle+hash】
2024-09-05 22:49:40
题意:给定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");
}
最新文章
- 关于war包 jar包 ear包 及打包方法
- ASP.net状态服务器使用
- wifi-mac
- K2 BPM+Microsoft Dynamics CRM,妥妥的~
- 苏泊尔借助微软CRM提升客户满意度
- mapred和mapreduce
- setTimeout setInterval 区别 javascript线程解释
- mongodb地理空间计算逻辑
- dom方法读取xml(不常用)
- JVM GC知识回顾
- 重装Win10系统的非常简单的操作教程
- day18_雷神_django第一天
- Number Sequence POJ - 1019 递推 数学
- XamarinAndroid组件教程RecylerView自定义适配器动画
- centos7配置apache服务
- linux 三剑客之awk
- 四、vue语法补充
- django multidb --- router
- Jmeter Connect to Cassandra
- css调用方式的方法
热门文章
- VMware 虚拟化编程(8) — 多线程中的 VixDiskLib
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_4_缓冲流的效率测试_复制文件
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_3_BufferedInputStream_字节缓冲
- object数据类型
- spring mvc 接受数组
- 重拾SQL——表中索值
- ABI与API的区别
- 史上最全的ORACLE基础教程
- 20171110面试笔记 服务器端程序员+C/C++开发
- [常用类]Scanner 类