UVA-11019 二维哈希算法
题意:
就是给你AB两个字符矩阵,问你B矩阵在A矩阵中的出现次数。
题解: 参考链接:https://blog.csdn.net/qq_38891827/java/article/details/80723483
我们可以进行二维hash,其实就是把n个横向串连在一起hash。
注意判相等的时候,我们不断进行尺取+hash,尺取的过程,我们删除当前第一行的hash值加上最后一行的hash值,删除第一行的hash值直接删去就可以
例如
AAAAAA
BBBBBB
CCCCCC
我们删去第一行的hash值 相当于把矩阵变成了
000000
BBBBBB
CCCCCC
此时我们再添加最后一行
000000
BBBBBB
CCCCCC
DDDDDD
如果这时候的B矩阵是
BBBBBB
CCCCCC
DDDDDD
这两个矩阵的hash值不同的,为了处理这种情况,我们把B矩阵相应的添加前几行
变成
000000
BBBBBB
CCCCCC
DDDDDD
这样再去匹配就可以了。
以上就是二维hash大概的处理方法(是我自己想的做法,如果有其他好的尺取方法欢迎指教
掌握了这个做法,我们就可以枚举矩阵的左上角,然后对于当前列数的矩阵从上向下进行尺取,hash判断就可以了。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<sstream>
#include<map>
using namespace std;
const int maxn=1e3+5;
const int N=1e6+5;
const int blo=31;
typedef unsigned long long ull;
ull hash_[maxn][maxn],xp[N];
char str[maxn][maxn],str2[maxn][maxn];
void init()
{
xp[0]=1;
for(int i=1; i<N; ++i)
{
xp[i]=xp[i-1]*blo;
}
}
ull Get_hash(int i,int j,int l)
{
return hash_[i][j]-hash_[i][j+l]*xp[l];
}
int main()
{
init();
int t;
scanf("%d",&t);
while(t--)
{
int n1,n2,m1,m2,ans=0;
scanf("%d%d",&n1,&m1);
for(int i=0; i<n1; ++i)
scanf("%s",str[i]);
scanf("%d%d",&n2,&m2);
for(int i=0; i<n2; ++i)
scanf("%s",str2[i]);
for(int i=0; i<n1; ++i)
{
hash_[i][m1]=0;
for(int j=m1-1; j>=0; j--)
{
hash_[i][j]=hash_[i][j+1]*blo+(str[i][j]-'A'+1);
}
}
ull tmp=0;
for(int i=n2-1; i>=0; --i)
{
for(int j=m2-1; j>=0; j--)
{
tmp=tmp*blo+(str2[i][j]-'A'+1);
}
}
for(int i=0; i<m1-m2+1; ++i)
{
ull tmp1=tmp,tmp2=0;
for(int j=n2-1; j>=0; j--)
{
tmp2=tmp2*xp[m2]+Get_hash(j,i,m2);
}
if(tmp1==tmp2) ans++;
for(int j=n2; j<n1; ++j)
{
tmp2-=Get_hash(j-n2,i,m2)*xp[(j-n2)*m2];
tmp2+=Get_hash(j,i,m2)*xp[j*m2];
tmp1=tmp1*xp[m2];
if(tmp2==tmp1) ans++;
} }
printf("%d\n",ans);
}
return 0;
}
UVA-11019 二维哈希算法的更多相关文章
- UVA 11019 二维匹配 AC自动机
这个题目要求在一个大矩阵里面匹配一个小矩阵,是AC自动机的灵活应用 思路是逐行按普通AC自动机匹配,用过counts[i][j]记录一下T字符矩阵以i行j列为开头的与P等大的矩阵区域 有多少行已经匹配 ...
- 使用C语言实现二维,三维绘图算法(1)-透视投影
使用C语言实现二维,三维绘图算法(1)-透视投影 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其实想想 ...
- 使用C语言实现二维,三维绘图算法(3)-简单的二维分形
使用C语言实现二维,三维绘图算法(3)-简单的二维分形 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...
- 使用C语言实现二维,三维绘图算法(2)-解析曲面的显示
使用C语言实现二维,三维绘图算法(2)-解析曲面的显示 ---- 引言---- 每次使用OpenGL或DirectX写三维程序的时候, 都有一种隔靴搔痒的感觉, 对于内部的三维算法的实现不甚了解. 其 ...
- [图形学] 习题8.12 NLN二维线段裁剪算法实现
Nicholl-Lee-Nicholl二维线段裁剪算法相对于Cohen-Sutherland和Liang-Barsky算法来说,在求交点之前进行了线段端点相对于几个区域的判断,可以确切的知道要求交点的 ...
- URAL - 1486 Equal Squares 二维哈希+二分
During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued about who o ...
- 【URAL 1486】Equal Squares(二维哈希+二分)
Description During a discussion of problems at the Petrozavodsk Training Camp, Vova and Sasha argued ...
- 【BZOJ 2462】矩阵模板 (二维哈希)
题目 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在 原矩阵中出现过. 所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
- AcWing - 156 矩阵(二维哈希)
题目链接:矩阵 题意:给定一个$m$行$n$列的$01$矩阵$($只包含数字$0$或$1$的矩阵$)$,再执行$q$次询问,每次询问给出一个$a$行$b$列的$01$矩阵,求该矩阵是否在原矩阵中出现过 ...
随机推荐
- kubernetes环境部署单节点redis
kubernetes部署redis数据库(单节点) redis简介 Redis 是我们常用的非关系型数据库,在项目开发.测试.部署到生成环境时,经常需要部署一套 Redis 来对数据进行缓存.这里介绍 ...
- 【Nginx】使用keepalive和nginx搭载高可用
首先介绍一下Keepalived,它是一个高性能的服务器高可用或热备解决方案,Keepalived主要来防止服务器单点故障的发生问题,可以通过其与Nginx的配合实现web服务端的高可用. Keepa ...
- ctfhub技能树—web前置技能—http协议—302跳转
开启靶机 打开环境,查看显示 点击Give me Flag后发生跳转 根据题目提示为HTTP临时重定向 简单记录一下HTTP临时重定向是什么 HTTP重定向:服务器无法处理浏览器发送过来的请求(req ...
- CALL TRANSACTION 使用说明
以调用事务VA03为例: 在程序中添加如下代码就可以实现 SET PARAMETER ID 'AUN' FIELD var. CALL TRANSACTION 'VA03' AND SKIP FIR ...
- Linux下载并安装JDK1.8
https://blog.csdn.net/Future_LL/article/details/84667634
- Sentry(v20.12.1) K8S 云原生架构探索,JavaScript Enriching Events(丰富事件信息)
系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...
- (Sql Server)存储过程(转载)
SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...
- 轻型目录访问协议 ldap 公司内部网站的登录 单点登录
https://zh.wikipedia.org/wiki/轻型目录访问协议 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛ ...
- 使用Robo 3T操作MongoDB数据库
安装Robo 3T连接MongoDB数据库教程:https://blog.csdn.net/baidu_39298625/article/details/98845789 在IDEA中用三个jar包链 ...
- Okio Okio源码分析
概述 Okio 作为 Okhttp 底层 io 库,它补充了 java.io 和 java.nio 的不足,使访问.存储和处理数据更加容易.Okio 的特点如下: okio 是一个由 square 公 ...