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$矩阵,求该矩阵是否在原矩阵中出现过 ...
随机推荐
- LeetCode844 比较含退格的字符串
题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = "ab#c", T = ...
- Flutter 基础组件:图片和Icon
前言 Flutter中,可以通过Image组件来加载并显示图片,Image的数据源可以是asset.文件.内存以及网络. ImageProvider 是一个抽象类,主要定义了图片数据获取的接口load ...
- 安装SVN和汉化包及基本使用
官网下载程序 和 下载汉化包. https://tortoisesvn.net/ 注意SVN汉化包版本需要和SVN版本一致,否则是无效的. 一.下载 1.进入官网,点击downloads 2.点击 ...
- python模块详解 | progressbar
参考官方文档:https://pypi.org/project/progressbar/#description progressbar 安装: pip install progressbar pro ...
- 与图论的邂逅06:dfs找环
当我在准备做基环树的题时,经常有了正解的思路确发现不会找环,,,,,,因为我实在太蒻了. 所以我准备梳理一下找环的方法: 有向图 先维护一个栈,把遍历到的节点一个个地入栈.当我们从一个节点x回溯时无非 ...
- flask文件下载
后端的代码 # coding:utf-8 from flask import Flask app = Flask(__name__) @app.route("/upload", m ...
- 浅谈自动化构建之grunt
自动化构建 开发行业的自动化构建 一句话把源代码转化为生产代码,作用是脱离运行环境兼容带来的问题开发阶段使用提高效率的语法,规范 和标准,构建转换那些不被支持的特性转化成能够执行的代码. 一.简单的自 ...
- rehash (重新散列)
rehash - Redis 设计与实现 http://redisbook.com/preview/dict/rehashing.html
- 命名规范 api-guidelines api规范
https://weui.io weui.css .weui-cell_select-before .weui-cell__bd:after{ display:none; } .weui-cell_s ...
- Elasticsearch--ES-Head--docker版安装
1.0ElasticSearch安装 # 拉取ES镜像docker pull elasticsearch:6.5.0 # 设置vm.max_map_count大小sysctl -w vm.max_ma ...