【学习笔记】[ABC274Ex] XOR Sum of Arrays
有点难😅
真的是 A B C ABC ABC的难度吗😅
非常精妙的哈希题目。
定义矩阵乘法: c i , j = ⊕ ( a i , k & b k , j ) c_{i,j}=\oplus (a_{i,k}\& b_{k,j}) ci,j=⊕(ai,k&bk,j)
之所以可以矩阵乘法是因为满足 ( a ⊕ b ) & c = ( a & c ) ⊕ ( b & c ) (a\oplus b)\& c=(a\& c)\oplus (b\& c) (a⊕b)&c=(a&c)⊕(b&c)
其实非常好验证,就把两个运算符按顺序写下来,然后把括号拆开,看等式两边是否恒等即可。
定义对于序列 { a i } \{a_i\} {ai}的哈希规则为,将每个 a k a_k ak与上 k − 1 k-1 k−1个 p p p后的结果全部异或起来
因为 ( a ⊕ b ) & p = ( a & p ) ⊕ ( b & p ) (a\oplus b)\&p=(a\& p)\oplus (b\& p) (a⊕b)&p=(a&p)⊕(b&p),所以如果 c i = a i ⊕ b i c_i=a_i\oplus b_i ci=ai⊕bi,那么 { c i } \{c_i\} {ci}的哈希值就是把 { a i } \{a_i\} {ai}和 { b i } \{b_i\} {bi}对应的哈希值异或起来
但是发现与上的 p p p都是相同的,所以这个方案冲突的概率很大
仔细观察正解的代码,发现他是把 p p p设计成了一个 M × M M\times M M×M的 01 01 01矩阵 (其中 M M M表示二进制位数,也就是 64 64 64), a i a_i ai看成一个长度为 M M M的 01 01 01向量 ,这个向量的第 i i i位就是 a i a_i ai在二进制下的第 i i i位
不妨形式化的写一下,首先我们随机一个矩阵 p p p,哈希值就是 ⊕ i = 1 n v i p i − 1 \oplus_{i=1}^nv_ip^{i-1} ⊕i=1nvipi−1。发现 c i = a i ⊕ b i c_{i}=a_{i}\oplus b_{i} ci=ai⊕bi那不就是把两个向量做按位异或吗。
直接倍增的复杂度是 O ( n M 3 log n ) O(nM^3\log n) O(nM3logn),考虑优化。
注意到是 01 01 01矩阵,所以可以把同一行压成一个 64 64 64位整数,这样转移优化到了 O ( M 2 ) O(M^2) O(M2)。
最终复杂度 O ( n M 2 log n ) O(nM^2\log n) O(nM2logn)。瓶颈在于倍增预处理,不知道可不可以做的更好。
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define ull unsigned long long
using namespace std;
const int N=5e5+5;
const int M=64;
mt19937_64 t(time(0));
struct Matrix{ull c[M];Matrix(){memset(c,0,sizeof c);}Matrix operator *(const Matrix &a)const{Matrix r;for(int i=0;i<M;i++){for(int j=0;j<M;j++){if(c[i]>>j&1){r.c[i]^=a.c[j];}}}return r;}
}pw[20];
int n,m;
ll a[N];
ull st[N][20];
ull get(ull x,Matrix y){ull res(0);for(int i=0;i<M;i++){if(x>>i&1)res^=y.c[i];}return res;
}
void write(ull x){if(x<10){cout<<(char)('0'+x);return;}write(x/10),cout<<(char)('0'+x%10);
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>m;srand(time(0));for(int i=1;i<=n;i++)cin>>a[i],st[i][0]=a[i];for(int i=0;i<M;i++){pw[0].c[i]=t();}for(int i=1;i<20;i++)pw[i]=pw[i-1]*pw[i-1];for(int j=1;j<20;j++){for(int i=1;i<=n-(1<<j)+1;i++){st[i][j]=st[i][j-1]^get(st[i+(1<<j-1)][j-1],pw[j-1]);}}for(int i=1;i<=m;i++){int b,c,d,e,f,g;cin>>b>>c>>d>>e>>f>>g;for(int j=19;j>=0;j--){if(b+(1<<j)-1<=c&&f+(1<<j)-1<=g&&(st[b][j]^st[d][j])==st[f][j]){b+=(1<<j),d+=(1<<j),f+=(1<<j);}}if(b>c){if(f>g)cout<<"No"<<"\n";else cout<<"Yes"<<"\n";}else{if(f>g)cout<<"No"<<"\n";else if((a[b]^a[d])<a[f])cout<<"Yes"<<"\n";else cout<<"No"<<"\n";}}
}
相关文章:
【学习笔记】[ABC274Ex] XOR Sum of Arrays
有点难😅 真的是 A B C ABC ABC的难度吗😅 非常精妙的哈希题目。 定义矩阵乘法: c i , j ⊕ ( a i , k & b k , j ) c_{i,j}\oplus (a_{i,k}\& b_{k,j}) ci,j⊕(ai,k&bk,j) 之所以可以矩阵乘法是因为满足 ( a ⊕ b )…...
抖音web频道爬虫
抖音web频道爬虫代码: <?php header(Content-Type:application/json; charsetutf-8);//抖音频道爬虫class DouyinChannel{private $app_id 1;private $spider_code 1;private $channels [["channel_name" > "热点","url"…...
sql中的替换函数replace()总结
1,表达式 --replace()--语法: REPLACE ( string_expression , string_pattern , string_replacement )--参数:string_expression:字符串表达式string_pattern:想要查找的子字符串string_replacement&#…...
vue3 vite使用 monaco-editor 报错
报错:Unexpected usage at EditorSimpleWorker.loadForeignModule 修改配置: "monaco-editor-webpack-plugin": "^4.2.0",删除不用 版本: "monaco-editor": "^0.28.1", 修改如下: opti…...
微信小程序获取蓝牙权限
要获取微信小程序中的蓝牙权限,您可以按照以下步骤进行操作: 1. 在 app.json 文件中添加以下代码: "permissions": { "scope.userLocation": { "desc": "需要获取您的地理位置授权以搜索…...
GE 8920-PS-DC安全模块
安全控制: 这个安全模块通常用于实现工业自动化系统中的安全控制功能。它可以监测各种安全参数,如机器运动、温度、压力等,以确保系统在安全范围内运行。 PLC兼容性: 通常,这种安全模块可以与可编程逻辑控制器&#x…...
UG\NX二次开发 使用BlockUI设计对话框时,如何设置默认的开发语言?
文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,C\C++,Qt-CSDN博客 简介: NX二次开发使用BlockUI设计对话框时,如何设置默认的代码语言? 效果: 方法: 依次打开“文件”->“实用工具”->“用户默认设置”->“用户界面”->“操作记录”->“…...
W5500-EVB-PICO进行UDP组播数据回环测试(九)
前言 上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试,那么本章我们进行UDP组播数据回环测试。 什么是UDP组播? 组播是主机间一对多的通讯模式, 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将…...
24 WEB漏洞-文件上传之WAF绕过及安全修复
目录 WAF绕过上传参数名解析:明确哪些东西能修改?常见绕过方法:符号变异-防匹配( " ;)数据截断-防匹配(%00 ; 换行)重复数据-防匹配(参数多次)搜索引擎搜索fuzz web字典文件上传安全修复方案 WAF绕过 safedog BT(宝塔) XXX云盾 宝塔过滤的比安全狗厉害一些&a…...
Python科研绘图--Task03
目录 图类型 关系类型图 散点图的例子 数据分布型图 rugplot例子 分类数据型图 编辑回归模型分析型图 多子图网格型图 FacetGrid() 函数 PairGrid() 函数 绘图风格、颜色主题和绘图元素缩放比例 绘图风格 颜色主题 绘图元素缩放比列 图类型 关系类型图 数据集变量…...
ssm端游游戏账号销售管理系统源码和论文
ssm端游游戏账号销售管理系统源码和论文069 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面…...
ssm+vue农家乐信息平台源码和论文
ssmvue农家乐信息平台源码和论文066 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 1、研究现状 国外,农家乐都被作为潜在的发展农村经济,增加农民收入的重要手段,让农户广…...
安装启动yolo5教程
目录 一、下载yolo5项目 二、安装miniconda(建议不要安装在C盘) 三、安装CUDA 四、安装pytorch 五、修改配置参数 六、修改电脑参数 七、启动项目 博主硬件: Windows 10 家庭中文版 一、下载yolo5项目 GitHub - ultralytics/yolov5:…...
封装redis 分布式锁 RedisCallback
RedisCallback 是redis 一个回调接口,在 Redis 连接后执行单个命令,返回执行命令后的结果。 如果在使用 RedisCallback 时,需要自动获取 Redis 连接资源,使用完毕后并释放连接资源。 RedisTemplate 类提供了一个 execute 方法&am…...
代码随想录算法训练营第17期第32天 | 122. 买卖股票的最佳时机 II、455.分发饼干、376. 摆动序列、53. 最大子序和
122. 买卖股票的最佳时机 II 我好像记得这道题是怎么写的,也不知道是福是祸 1. 收集每天的正利润就可以,收集正利润的区间,就是股票买卖的区间,而我们只需要关注最终利润,不需要记录区间 2.局部最优:收集…...
iOS HealthKit 介绍
文章目录 一、简介二、权限配置1. 在开发者账号中勾选HealthKit2. 在targets的capabilities中添加HealthKit。3. infoPlist需要配置权限 三、创建健康数据管理类1. 引入头文件2. 健康数据读写权限3. 检查权限4. 读取步数数据5. 写入健康数据 四、运行获取权限页面 一、简介 He…...
Windows平台Unity下播放RTSP或RTMP如何开启硬解码?
我们在做Windows平台Unity播放RTMP或RTSP的时候,遇到这样的问题,比如展会、安防监控等场景下,需要同时播放多路RTMP或RTSP流,这样对设备性能,提出来更高的要求。 虽然我们软解码,已经做的资源占有非常低了…...
模板方法模式在JDBCTemplate中的应用
上一篇中系统总结了模板模式的原理和使用,提到了模板方法和回调接口。回调接口和模板方法类之间的关系可以看作服务与被服务的关系,模板方法类想要回调接口做事,就要提供相应的资源,接口用提供的资源做事,完事后&#…...
如何在Debian中同步系统时间?Debian 系统时间配置(NTP服务)
A. 更新源,并安装ntpdate apt-get update apt-get install ntpdate ntpdate ntp1.aliyun.com 修改时区 修改设置Linux服务器时区 方法 A 命令 : “tzselect” 方法 B 仅限于RedHat Linux 和 CentOS 命令 : “timeconfig” 方法 C 适用于Debian 命令 : “dpkg-reconfigur…...
模板方法模式(十六)
相信自己,请一定要相信自己 上一章简单介绍了代理模式(十五), 如果没有看过, 请观看上一章 一. 模板模式 引用 菜鸟教程里面的 模板模式介绍: https://www.runoob.com/design-pattern/template-pattern.html 在模板模式(Template Pattern)…...
RVC与VITS技术对比:检索式vs端到端语音转换的适用场景分析
RVC与VITS技术对比:检索式vs端到端语音转换的适用场景分析 1. 引言 你有没有想过,为什么有些AI翻唱听起来特别像原唱,而有些则感觉“味儿”不太对?或者,为什么有些语音转换工具训练起来飞快,但效果时好时…...
RISC-V开发工具链技术解析与选型指南
1. RISC-V开发工具链技术解析1.1 RISC-V生态发展背景随着处理器架构领域对开放性和灵活性的需求增长,RISC-V指令集架构凭借其开源特性获得了广泛关注。与传统架构相比,RISC-V免除了授权费用,降低了开发门槛,这使得芯片厂商和工具链…...
Phi-4-reasoning-vision-15B行业应用:银行手机银行截图→交易流程合规性审计
Phi-4-reasoning-vision-15B在银行手机银行截图合规审计中的应用实践 1. 银行业务合规审计的痛点与机遇 在银行业务数字化转型的浪潮中,手机银行已成为客户办理业务的主要渠道。然而,随之而来的是海量的交易截图和操作记录需要人工审核,以确…...
金仓V9智能运维揭秘:如何用国产数据库实现分钟级部署与自动化备份
金仓V9智能运维实战:从分钟级部署到自动化备份的全流程解析 在数字化转型浪潮中,数据库作为企业核心基础设施,其运维效率直接影响业务连续性。金仓数据库V9全平台版凭借智能运维体系,正在重新定义国产数据库的管理标准。本文将深入…...
3步搞定黑苹果:OpCore-Simplify自动化配置工具深度体验
3步搞定黑苹果:OpCore-Simplify自动化配置工具深度体验 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑苹果配置而头痛不已…...
BGE-Large-Zh效果对比:BGE-Large-Zh vs m3e-base在中文长尾词匹配上的实测差异
BGE-Large-Zh效果对比:BGE-Large-Zh vs m3e-base在中文长尾词匹配上的实测差异 1. 引言:为什么关注中文长尾词匹配 在日常的中文信息检索和语义匹配场景中,我们经常会遇到一些特殊的长尾词汇。这些词汇可能是不常见的专业术语、新兴的网络用…...
leetcode 1534. 统计好三元组 Count Good Triplets
Problem: 1534. 统计好三元组 Count Good Triplets 用变量存储数组中的值,防止多次访问IO Code class Solution { public:int countGoodTriplets(vector<int>& arr, int a, int b, int c) {int n arr.size(), a1, b1, c1, ans 0;for(int i 0; i <…...
HDF5文件可视化指南:用HDFView检查你的Python数据存储结果
HDF5文件可视化指南:用HDFView检查你的Python数据存储结果 当你用Python处理完一批数据并存入HDF5文件后,最让人忐忑的莫过于——数据真的按预期存储了吗?结构是否正确?数值有无异常?本文将带你用HDFView这款专业工具&…...
SpaceClaim流体域实战:从零到一构建仿真计算空间
1. 流体域基础概念与工程价值 第一次接触流体域这个概念时,我正对着电脑屏幕发愁——明明在物理世界里空气无处不在,为什么在仿真软件里非得画个"框"才能计算?这个看似简单的方盒子,后来成了我CFD生涯中最重要的"…...
别再当黑匣子用了!手把手教你用FastMCP的tool()、resource()和prompt()装饰器,从源码理解到实战避坑
FastMCP装饰器深度解析:从tool()到prompt()的实战进阶指南 1. 为什么需要理解装饰器内部机制? 在Python开发领域,装饰器(Decorator)是一种强大的元编程工具,而FastMCP框架中的tool()、resource()和prompt()装饰器更是将这一理念发…...
