bzoj 2351 [BeiJing2011]Matrix——二维哈希

本文深入探讨了一种用于处理二维矩阵数据的高效哈希算法,该算法通过行和列的双重哈希处理,实现对矩阵片段的快速匹配与检索。文章详细介绍了算法的实现过程,包括使用两个不同的哈希基数进行逐行和逐列哈希,以及如何通过构建哈希值映射表来加速查询效率。此外,还提供了一个完整的C++代码示例,展示了算法的具体实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2351

就是先把每行单独从左到右扫着乘一个 b1 哈希起来,然后再按列从上往下乘一个 b2 哈希起来。

如果要取模的话,行的哈希和列的哈希应该模一样的数。

当然不是读入询问再枚举所有位置看哈希值啦……应该先把合法位置的哈希值用一个 map 之类的存一下存在性,询问的时候直接查 map 就行了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ull unsigned long long
using namespace std;
const int N=1005,b1=1e9+7,b2=993244853;
int n,m,a,b; ull bn1[N],bn2[N],hs[N][N];
map<ull,bool> mp;
int main()
{
  scanf("%d%d%d%d",&n,&m,&a,&b);
  bn1[0]=1;for(int i=1;i<=n;i++)bn1[i]=bn1[i-1]*b1;
  bn2[0]=1;for(int i=1;i<=m;i++)bn2[i]=bn2[i-1]*b2;
  for(int i=1,d;i<=n;i++)
    for(int j=1;j<=m;j++)
      {
    scanf("%1d",&d); d++;//
    hs[i][j]=hs[i][j-1]*b2+d;
      }
  for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
      hs[i][j]=hs[i-1][j]*b1+hs[i][j];
  for(int i=a;i<=n;i++)
    for(int j=(i==a?b:1);j<=m;j++)
      {
    ull tp=hs[i][j] - hs[i-a][j]*bn1[a]
      - hs[i][j-b]*bn2[b] + hs[i-a][j-b]*bn1[a]*bn2[b];
    mp[tp]=1;
      }
  int Q; scanf("%d",&Q);
  while(Q--)
    {
      ull tmp=0;
      for(int i=1,d;i<=a;i++)
    for(int j=1;j<=b;j++)
      {
        scanf("%1d",&d); d++;
        tmp+=d*bn1[a-i]*bn2[b-j];
      }
      puts(mp[tmp]?"1":"0");
    }
  return 0;
}

 

转载于:https://www.cnblogs.com/Narh/p/10447262.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值