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$矩阵,求该矩阵是否在原矩阵中出现过 ...
随机推荐
- MySQL select if 查询最后一个主键 id
查询最后一个主键id SELECT IF(MAX(id) IS NULL, 0, MAX(id)) AS maxid FROM users; 查询最小的主键id SELECT IF(MIN(id) I ...
- mysql过滤复制
- 翻译 - ASP.NET Core 托管和部署 - 在 Linux 上使用 Nginx 托管 ASP.NET Core 网站
翻译自 https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-5.0 本文介 ...
- python之格式化字符串速记整理
一.格式化字符串的方式: 1.字符串表达式: 语法格式:'%s' % var 或 '%s %d' % (var1, var2) 说明:%s.%d等为格式类型说明符 例子: >>> ...
- merge join pg伪代码
Join { get initial outer and inner tuples INITIALIZE do forever { while (outer != inner) { SKIP_TEST ...
- 微人事项目-mybatis-持久层
摘要 最近将微人事这个开源项目进行了复现,这篇文章记录mybaits访问数据库这一块. 其中MyBatis是一个流行的持久层框架,支持自定义SQL.存储过程和高级映射.MyBatis消除了几乎所有的J ...
- SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
作为后台服务开发,在日常工作中我们天天都在跟数据库打交道,一直在进行各种CRUD操作,都会使用到数据库连接池.按照发展历程,业界知名的数据库连接池有以下几种:c3p0.DBCP.Tomcat JDBC ...
- 从JAVA内存到垃圾回收,带你深入理解JVM
摘要:学过Java的程序员对JVM应该并不陌生,如果你没有听过,没关系今天我带你走进JVM的世界.程序员为什么要学习JVM呢,其实不懂JVM也可以照样写出优质的代码,但是不懂JVM有可能别被面试官虐得 ...
- FTP使用Socket SSL流程认证(一)
关于Ftp使用SSL流程认证 本文章使用的是C#,ftp服务器为FileZilla 注:如果不是使用的Socket可以使用FtpWebRequst类,说实话,该类比较简单,但现在说的是SOCKET,网 ...
- 详解Mybatis拦截器(从使用到源码)
详解Mybatis拦截器(从使用到源码) MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能. 本文从配置到源码进行分析. 一.拦截器介绍 MyBatis 允许你在 ...