蓝书(算法竞赛进阶指南)刷题记录——BZOJ2351 Matrix(hash)

ACM进阶指南(算法学习,新手必看) 如何从一个小白成长为牛人,这里有你想要的 立即下载

题目:BZOJ2351.
题目大意:给定一个 N ∗ M N*M N∗M的大 01 01 01矩阵,以及 Q Q Q个 A B AB AB的小 01 01 01矩阵,问有每个小矩阵是否在大矩阵中出现.
1 ≤ n , m ≤ 1 0 3 , q = 1 0 3 1\leq n,m\leq 10^3,q=10^3 1≤n,m≤103,q=103,小矩阵为边长 ≤ 100 \leq 100 ≤100的正方形.

看到这道题我们就会想到考虑这个问题在一维情况下的做法,直接什么AC自动机,什么KMP之类的算法都可以解决.

但是考虑在二维情况下怎么办?二维AC自动机 矩阵hash!

我们考虑字符串hash是把一个字符串看成一个 P P P进制数,那么矩阵hash呢?考虑先把矩阵的每一行看成一个 P 1 P1 P1进制数得到所有数,再把每一行所表示的 P P P进制数看成一个数,把整个矩阵看成一个字符串,那么再把这个字符串当成一个 P 2 P2 P2进制数就可以了.

具体来说,我们设置一个数 P 1 P1 P1,先把每一行当成一个字符串预处理出每个前缀对应的 P 1 P1 P1进制数.然后对于每一个 i i i行 j j j列的前缀矩阵,我们只要把每一行 j j j个数的前缀对应的 P 1 P1 P1进制数当成这个子矩阵对应的一个字符串,然后把这个字符串当成一个 P 2 P2 P2进制数预处理一下每个前缀对应的 P 2 P2 P2进制数即可.

那么在这个情况下,我们类比二维前缀和,设 i i i行 j j j列的前缀矩阵对应的值为 s [ 1.. i ] [ 1.. j ] s[1..i][1..j] s[1..i][1..j],第 x 1 + 1 x1+1 x1+1行到第 x 2 x2 x2行,第 y 1 + 1 y1+1 y1+1列到 y 2 y2 y2列所对应的数值为 c ( x 1 , x 2 , y 1 , y 2 ) c(x1,x2,y1,y2) c(x1,x2,y1,y2),那么:
c ( x 1 , x 2 , y 1 , y 2 ) = s [ x 2 ] [ y 2 ] − P 2 y 2 − y 1 s [ x 2 ] [ y 1 ] − P 1 x 2 − x 1 s [ x 1 ] [ y 2 ] + P 2 y 2 − y 1 P 1 x 2 − x 1 s [ x 1 ] [ y 1 ] c(x1,x2,y1,y2)=s[x2][y2]-P2^{y2-y1}s[x2][y1]-P1^{x2-x1}s[x1][y2] +P2^{y2-y1}P1^{x2-x1}s[x1][y1] c(x1,x2,y1,y2)=s[x2][y2]−P2y2−y1s[x2][y1]−P1x2−x1s[x1][y2]+P2y2−y1P1x2−x1s[x1][y1]

这个大概还好理解吧…我知道写得很丑

反正理解了这个式子后,我们就可以直接写出代码了(注:这道题有一道相同的题BZOJ2462,但是这份代码在那道题上会TLE,大概是被卡常或者卡hash了):

#include<bits/stdc++.h>
  using namespace std;
 
#define Abigail inline void
typedef long long LL;
typedef unsigned long long ULL;
 
const int N=1000;
const ULL P1=131,P2=13331,M=5000081;
 
char rc(){
  char c=getchar();
  while (c<'0'||c>'1') c=getchar();
  return c;
}
 
ULL s[N+9][N+9],Pow1[N+9],Pow2[N+9];
int n,m,a,b;
 
ULL Hash(int a,int b,int c,int d){
  return s[b][d]-s[b][c-1]*Pow1[d-c+1]-s[a-1][d]*Pow2[b-a+1]+s[a-1][c-1]*Pow2[b-a+1]*Pow1[d-c+1];
}
 
struct Hash_table{
  int h[M+9];
  ULL v[M+9];
   
  void add(ULL &x,const ULL &b){x+=b;if (x>=M) x-=M;}
   
  void insert(ULL x){
    ULL t=x;
    for (x%=M;h[x]&&v[x]^t;add(x,5));
    ++h[x];v[x]=t;
  }
   
  bool find(ULL x){
    ULL t=x;
    for (x%=M;h[x]&&v[x]^t;add(x,5));
    return h[x]?1:0;
  }
   
}h;
ULL x,tmp[N+9];
 
Abigail into(){
  scanf("%d%d%d%d",&n,&m,&a,&b);
  Pow1[0]=Pow2[0]=1;
  for (int i=1;i<=m;++i) Pow1[i]=Pow1[i-1]*P1;
  for (int i=1;i<=n;++i) Pow2[i]=Pow2[i-1]*P2;
  for (int i=1;i<=n;++i)
    for (int j=1;j<=m;++j)
      s[i][j]=s[i][j-1]*P1+rc();
  for (int i=1;i<=n;++i)
    for (int j=1;j<=m;++j){
      s[i][j]+=s[i-1][j]*P2;
      if (i>=a&&j>=b) h.insert(Hash(i-a+1,i,j-b+1,j));
    }
}
 
Abigail getans(){
  int q;
  scanf("%d",&q);
  while (q--){
    for (int i=1;i<=a;++i){
      tmp[i]=0;
      for (int j=1;j<=b;++j)
        tmp[i]=tmp[i]*P1+rc(); 
    }
    x=0;
    for (int i=1;i<=a;++i)
      x=x*P2+tmp[i];
    puts(h.find(x)?"1":"0");
  }
}
 
int main(){
  into();
  getans();
  return 0; 
} 
【点云概述】什么是点云、来源、种类、特点、处理? 【点云概述】什么是点云、来源、种类、特点、处理?点云(point cloud)是空间中点的数据集,可以表示三维形状或对象,通常由三维扫描仪获取。点云中每个点的位置都由一组笛卡尔坐标 ( X , Y , Z ) (X, Y, Z) (X,Y,Z)描述,有些可能含有色彩信息 ( R , G , B ) (R, G, B) (R,G,B)或物体反射面强度(Intensity)信。 阅读详情

相关推荐

【知识图谱】一文看懂知识图谱的搭建实践与科普教程(5万字完结篇)

所有可能的实体对:(“Mate40”,“华为”), (“Mate40”,“手机”), (“华为”,“手机”)。送入关系模型分类,预期输出 (“Mate40”,“华为”): 品牌, (“Mate40”,“手机”): 属于类别, (“华为”,“手机”): 无关系。,定义了图谱中概念和关系的类型层次结构,相当于知识图谱的“纲领”和“schema”。训练完成后,当模型看到新的句子,比如“苹果的MacBook笔记本性能强大”,识别出实体“苹果”(品牌)和“MacBook”(产品)后,就能正确输出关系“品牌”。

weixin_41645791的博客 2611

C++ 【蓝书】网络流问题(网络流基础概念+三个算法+做题时的选择+模板整合)【网络流从入门到放弃】

明天写。。。

超逸の学习技术博客 1922

ArcGIS新手必看:HWSD2土壤数据从下载到批量提取TIFF的完整流程

本文详细介绍了ArcGIS中HWSD2土壤数据的完整处理流程,从数据下载、预处理到批量提取TIFF文件。涵盖栅格属性表构建、属性数据连接及性能优化等关键步骤,帮助新手高效掌握HWSD2数据提取技术,提升地理信息数据处理效率。

ll5678的博客 1035

蓝书(算法竞赛进阶指南)学习笔记

算法竞赛进阶指南——笔记 0X00 - 0x01位运算 知识: 位移(左移右移)快速幂 快速乘等等 二进制压缩 (隐隐约约指向 状压DP )基操 取数 位运算特点 二进制下不进位利用这特点可以我们可以做题 小技巧(应用邻接表 我不用) n为偶数时 n ^ 1 = n + 1; n为基数时 n ^ 1 = n - 1; lowbit 运算 最低位的1与之后的0 广泛应用于各地 例题 CH0101/Acwing(vjudge) 求a^b的次方mod p数据范围为1e9/1e18 我们已知所有

lan_m的博客 2338

基于微信小程序的智能门禁管理系统的设计与实现(文章+源码)

基于微信小程序门禁管理小程序,该系统支持用户注册登录、查阅新闻动态、提交开门申请和发布留言等功能,同时管理员可以进行用户管理、新闻信息管理、门禁审批管理和留言管理等操作。该系统将采用IDEA开发工具、SSM框架和MYSQL数据库等相关技术,实现用户登录注册、个人信息管理、门禁申请提交、管理员审核等功能。该系统的实现,可以有效提高门禁管理的效率和便利性,同时也具有较强的可扩展性和可维护性。本研究对于智能门禁管理系统的设计和实现具有一定的参考价值。

u011779145的博客 1396

Ubuntu20.04下 嵌入式 Qt 开发环境的搭建(适用于Tiny6410)

Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建 目录导航Ubuntu 下 Tiny6410 嵌入式 Qt 开发环境的搭建前言1.安装前的准备工作2.安装交叉编译器 前言 这篇文章,主要是基于 Ubuntu19.10版本而写,写此文的初衷,是为了自己使用,因为最近正在以Tiny6410板子做实训,所以也是初学者一枚,只能保证我遇上的问题统统能够解决掉,至于一些没遇上的,欢迎各位看客给我留言,大家一起讨论,一起解决。 注:本文会持续更新 1.安装前的准备工作 环境要求 Linux系统:U

繁臻的小窝 4893

算法竞赛入门经典训练指南(蓝书)Ping pong(UVaLive4329)树状数组

题意 在一个序列中,存在三个数为升序摆放或降序摆放,则这三个数可以视作能够举行比赛。问比赛的种数。 ps.升序或降序表示两个运动员之间的人中有人可以充当裁判,同时两个运动员愿意去裁判家中比赛。 思路 若 a1a_1a1​ 到 ai−1a_{i-1}ai−1​ 有 bib_ibi​ 个数比 aia_iai​ 小,那么就有 i−1−bii-1-b_ii−1−bi​ 个数比 aia_iai​ 大。所以我们可以记录 aia_iai​ 左边比 aia_iai​ 小的数与 aia_iai​ 右边比 aia_iai​ 小

CofDoria的博客 462

单片机课程设计——交通灯

单片机课程设计——交通灯一、课程设计主要内容1.1 题目1.2摘要1.3关键词二、设计要求三、设计方案四、参考电路设计4.1.1数码管的设计4.1.2对应程序4.2.1独立按键的设计4.2.2对应程序4.2.3 使用逻辑4.3.1LED模块的设置4.3.2 LED实物图4.3.3 LED显示程序五、调试要点5.1 单片机最小系统5.2 数码管模块5.3 LED模块5.4 独立按键六、总结七、成品图完整程序 一、课程设计主要内容 1.1 题目 交通灯设计 1.2摘要 近年来,随着我国国民经济的快速发展,我国机

PKPROTEUS的博客 3万+

蓝书(算法竞赛进阶指南)刷题记录——POJ1961 Period(KMP算法)

题目:POJ1961. 题目大意:给定一个长度为nnn的字符串S[1..n]S[1..n]S[1..n],求出对于每一个前缀S[1..i]S[1..i]S[1..i]满足最大循环次数大于111,该前缀的长度与最大循环次数. 注:一个串S[1..n]S[1..n]S[1..n]的一个iii最小的前缀S[1..i]S[1..i]S[1..i]满足S[1..i]S[1..i]S[1..i]重复k(k∈N...

hzk_cpp的博客 443

Cesium生态盘点:超图、火星3D等15个二次开发框架对比

本文深入解析Cesium生态中的15个二次开发框架,包括超图、火星3D等主流选择,帮助开发者根据项目需求进行精准选型。从性能表现、功能完备性、开发友好度等维度进行对比,特别适合需要处理地理空间数据和构建三维可视化的JavaScript开发者。

weixin_28197941的博客 497

C++ Qt6 qml CMakeLists.txt如何添加qrc文件

本文介绍了在Qt6项目中如何通过CMake管理QML图片资源。相比Qt5的qmake,CMake需要手动创建qrc文件并配置CMakeLists.txt。关键步骤包括:1)创建resources.qrc文件并添加图片资源;2)在CMakeLists.txt中设置CMAKE_AUTORCC为ON开启自动资源处理;3)使用qt_add_resources将qrc文件绑定到项目。配置完成后,可通过"qrc:alias"方式引用资源图片,解决了相对路径管理复杂的问题。

琅嬛福地 1453

《算法竞赛进阶指南》蓝书重做记录

重新复习蓝书(基础算法,数论,DP和图论),争取 \(1.5\) 个月内完成,期间会不定期更新 此次记录,过往的题也会重新编写题解并收录 补题链接:Here Initialize02学长的学习笔记 0x00 基本算法 0x01 位运算 A题:a^b https://ac.nowcoder.com/acm/contest/996/A 题目描述 求 a 的 b 次方对 p 取模的值,其中 0 &...

橘嘉禾 195

基于单片机的智能体重秤设计与嵌入式程序实现

智能体重秤的基本功能是测量用户的体重,并将数据通过无线方式传输到终端设备(如智能手机、电脑或云平台)进行管理。体重测量:实时测量用户体重,并进行数据存储。BMI(体质指数)计算:基于体重和身高计算BMI值,帮助用户了解健康状况。多用户管理:通过蓝牙或Wi-Fi技术支持多用户体重数据记录。健康数据分析:结合历史数据分析体重变化趋势。语音播报:通过语音播报用户体重,便于老人或视力不便的人士使用。数据同步:通过App或云平台同步数据,进行长期健康监控。

2201_76125393的博客 1755

这13本豆瓣高分算法书,必读!

“算法到底应该怎么学?”“程序员必须掌握哪些算法?”“大公司笔试、面试都有哪些经典算法题目?”这一系列在知乎上受到关注众多的算法提问,一方面反映出大家学习算法的热情非凡,另一方面也看得出大家苦于没有系统的学习路径,不知道什么阶段应该做什么。好的算法就像魔法一样,可以把一件需要耗费数小时甚至数天完成的事情变为几秒钟的事情,大大提高工作效率。在日新月异的 ChatGPT 时代,学习算法仍然非常重要,算...

图灵教育 3049

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

算法进阶-蓝书-起床困难症

int calc(vector<vector<int>> vec, int bt, int base) { int res = base; for (int i = 0; i < vec.size(); i++) { int op = vec[i][0]; int para = vec[i][1]>>bt; if (op == 0)res &= para; else if (op == 1)res |= para; els...

weixin_40428368的博客 230

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

算法竞赛入门经典训练指南(蓝书)上的LA是什么算法网站,网址是什么

蓝书上LA网站的网址为https://icpcarchive.ecs.baylor.edu/index.php 当然你也可以在vj上提交,但有时会出现错误,例如Submission error

weixin_43899268的博客 834

蓝书(算法竞赛进阶指南)刷题记录——CH5402 & 洛谷2014 选课(树形DP)

题目:CH5402/luogu2014. 题目大意:给定一棵nnn个点有根树的森林,要求在森林中选mmm个点,使得点权之和最大.若一个点要选,则它的父亲也要选. 1≤m≤n≤3001\leq m\leq n\leq 3001≤m≤n≤300. 首先建立一个虚点作为所有树树根的父亲变成一棵有根树,问题变成求一个最大包含虚点的m+1m+1m+1个点组成的连通块使得点权和最大. 设f[i][j]f[i]...

hzk_cpp的博客 468

蓝书(算法竞赛进阶指南)刷题记录——POJ1475 Pushing Boxes(bfs套bfs)

题目:POJ1475. 题目大意:给定一个n∗mn*mn∗m的迷宫,现在有一个箱子和一个人,要求让这个人把箱子推到指定位置,求箱子的移动步数最少的方案并输出,若有多个则要求人的移动步数也最少,若还有多个方案则输出任意一个. 1≤n,m≤201\leq n,m\leq 201≤n,m≤20. ...

hzk_cpp的博客 375

蓝书(算法竞赛进阶指南)刷题记录——POJ3076 Sudoku(dfs+剪枝)

题目:POJ3076. 题目大意:给定一个16∗1616*1616∗16的数独,要求填完这个数独. 首先考虑给每一个空格记录一个161616为二进制数表示这个空格可以填哪些数,第iii位为000表示第iii个字符未填. 然后我们就可以大力dfs了.不过可以先填当前可能性最少的空格,从而达到优化的效果. 发现还是不够快,继续考虑优化. 考虑对于每个空格,当这个空格A..PA..PA..P均不能填时,...

hzk_cpp的博客 525

蓝书(算法竞赛进阶指南)刷题记录——POJ1742 Coins(DP+贪心)

题目:POJ1742. 题目大意:给定nnn种物品,物品iii价值为AiA_iAi​,数量为CiC_iCi​,问1 m1~m1 m之间多少种面值能被凑出来. 1≤n≤100,1≤m,Ai≤105,1≤Ci≤1031\leq n\leq 100,1\leq m,A_i\leq 10^5,1\leq C_i\leq 10^31≤n≤100,1≤m,Ai​≤105,1≤Ci​≤103...

hzk_cpp的博客 304

蓝书(算法竞赛进阶指南)刷题记录——hdu4348 To the moon(主席树)

题目大意:给定一个长度为nnn的序列,要求支持以下操作mmm次: 1.格式C&ThinSpace;l&ThinSpace;r&ThinSpace;dC\,l\,r\,dClrd,表示给区间[l,r][l,r][l,r]加上ddd并给时刻ttt加111. 2.格式Q&ThinSpace;l&ThinSpace;rQ\,l\,rQlr,表示查询当前区间[l,r]...

hzk_cpp的博客 308

蓝书(算法竞赛进阶指南)刷题记录——CH5102 Mobile Service(DP)

题目:CH5102. 题目大意:三个人一开始在1,2,31,2,31,2,3的位置,每次给定一个111~lll的坐标(必须按顺序),他们之中必须有一个人走到这个坐标,且他们之中不能有两人站在同一位置,从点xxx走到点yyy的花费为c(x,y)c(x,y)c(x,y),求最小花费. 首先这是一道十分裸的DP,我们可以设状态f[i][x][y][z]f[i][x][y][z]f[i][x][y][z]...

hzk_cpp的博客 428

卧槽,「算法刷题宝典」开放下载!

今天推荐一个关于「算法刷题宝典」的开源项目:力扣Cookbook。力扣 Cookbook是@halfrost(中文名:霜神)去年刷的 力扣整理出的 520 题,每道题都写了解题思路,并且...

tanqingbo的博客 384

蓝书(算法竞赛进阶指南)刷题记录——POJ2176 Folding(区间DP)

题目:POJ2176. 题目大意:给定一个串sss,求它压缩后长度最小的串.其中压缩是指把一个串中某些子串压成“出现次数(循环节)”的形式,如串ABABABABABABABABAB可以压成3(AB)3(AB)3(AB). 1≤∣S∣≤3001\leq |S|\leq 3001≤∣S∣≤300. 容易发现[l,r][l,r][l,r]要么通过子区间[l,mid][l,mid][l,mid]和[mid...

hzk_cpp的博客 325

蓝书(算法竞赛进阶指南)刷题记录——POJ2888 Naptime(DP)

题目:POJ2888. 题目大意:给定一个长度为nnn的环状数列,在这个环状数列上取mmm个数,其中每一个极大连续段的开头没有贡献,其余均有贡献,求最大贡献和. 0≤b≤n≤36000\leq b\leq n\leq 36000≤b≤n≤3600. 首先不考虑这是个环而是个序列,直接DP.设f[i][j][0/1]f[i][j][0/1]f[i][j][0/1]表示第111到iii个数中取了jjj...

hzk_cpp的博客 299

蓝书(算法竞赛进阶指南)刷题记录——Codeforces 451 E Devu and Flowers(容斥原理+Lucas定理)

题目:CF 451 E. 题目大意:给定nnn种花,第iii种花有AiA_iAi​束,现在要选出mmm束花,问方案数. 我们可以知道如果m≤Aim\leq A_im≤Ai​,那么方案数就是Cn−1n+m−1C_{n-1}^{n+m-1}Cn−1n+m−1​. 如果m&amp;amp;amp;amp;amp;gt;Aim&amp;amp;amp;amp;amp;gt;A_im&amp;amp;amp;amp;gt;Ai​,那么我们就需要把所有方案中有任意一种花iii选超过了AiA_iA

hzk_cpp的博客 531

蓝书(算法竞赛进阶指南)刷题记录——POJ1733 Parity game(并查集)

题目:POJ1733. 题目大意:给定nnn个区间[li,ri][l_i,r_i][li​,ri​]和aia_iai​,表示[li,ri][l_i,r_i][li​,ri​]的权值和为奇数或偶数,问到哪一个区间不矛盾,但它的下一个区间矛盾. 1≤n≤5∗1031\leq n\leq 5*10^31≤n≤5∗103. 容易想到前缀和,那么区间就变成了两个点li−1l_i-1li​−1和rir_iri...

hzk_cpp的博客 497
上一篇: BZOJ2160 拉拉队排练题解(manacher)
下一篇: BZOJ2820 YY的GCD题解(Mobius反演+除法分块)
hezlik
博客等级 码龄9年 111粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值