BZOJ 2351 Matrix(哈希)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2351
题意:给出一个n*m的01矩阵。再给出10个A*B的小01矩阵。判断这些小的矩阵是不是原矩阵的子矩阵。
思路:将原矩阵的每个A*B的矩阵哈希成一个值。给出的小矩阵也哈希成一个值。则直接查找即可。
char s[N][N];
int n,m,A,B;
u64 h[N][N],f[N][N];
u64 p[N];
void init()
{
if(B>m) return;
int i,j;
u64 x;
FOR1(i,n)
{
x=0;
FOR1(j,B) x=x*107+s[i][j];
f[i][B]=x;
for(j=B+1;j<=m;j++)
{
f[i][j]=(f[i][j-1]-s[i][j-B]*p[B-1])*107+s[i][j];
}
}
if(n<A) return;
for(j=B;j<=m;j++)
{
x=0;
FOR1(i,A) x=x*107+f[i][j];
h[A][j]=x;
for(i=A+1;i<=n;i++)
{
h[i][j]=(h[i-1][j]-f[i-A][j]*p[A-1])*107+f[i][j];
}
}
}
char str[N][N];
int OK(int x,int y)
{
int i,j;
FOR1(i,A) FOR1(j,B) if(str[i][j]!=s[x-A+i][y-B+j])
{
return 0;
}
return 1;
}
int check()
{
if(B>m||A>n) return 0;
int i,j;
u64 a[105];
FOR1(i,A)
{
a[i]=0;
FOR1(j,B) a[i]=a[i]*107+str[i][j];
}
i64 x=0;
FOR1(i,A) x=x*107+a[i];
for(i=A;i<=n;i++) for(j=B;j<=m;j++)
{
if(h[i][j]==x&&OK(i,j)) return 1;
}
return 0;
}
int main()
{
RD(n,m); RD(A,B);
int i;
FOR1(i,n) RD(s[i]+1);
p[0]=1;
for(i=1;i<N;i++) p[i]=p[i-1]*107;
init();
int k;
RD(k);
while(k--)
{
FOR1(i,A) RD(str[i]+1);
PR(check());
}
}
BZOJ 2351 Matrix(哈希)的更多相关文章
- BZOJ 4128: Matrix
BZOJ 4128: Matrix 标签(空格分隔): OI BZOJ 大步小步 矩阵 费马小定理 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...
- bzoj 2351 [BeiJing2011]Matrix——二维哈希
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2351 就是先把每行单独从左到右扫着乘一个 b1 哈希起来,然后再按列从上往下乘一个 b2 哈 ...
- 【BZOJ 2351】 Matrix
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2351 [算法] 哈希 [代码] #include<bits/stdc++.h& ...
- 【BZOJ 2351】Matrix(Hash)
题目链接 二维\(Hash\)类似二维前缀和,每一行看成一个\(h\)进制数,每一个以(1,1)为左上角的矩阵看成一个由每一行的\(Hash\)值组成的\(l\)进制数. 然后自己推推柿子就行. #i ...
- bzoj 4128: Matrix ——BSGS&&矩阵快速幂&&哈希
题目 给定矩阵A, B和模数p,求最小的正整数x满足 A^x = B(mod p). 分析 与整数的离散对数类似,只不过普通乘法换乘了矩阵乘法. 由于矩阵的求逆麻烦,使用 $A^{km-t} = B( ...
- BZOJ 4128 Matrix ——BSGS
矩阵的BSGS. 只需要哈希一下存起来就可以了. 也并不需要求逆. #include <map> #include <cmath> #include <cstdio> ...
- luogu 3538/bzoj 2795 Poi2008 哈希+质数结论
题意:给定一个子串,询问一些子区间内的最短循环节(循环节是越短条件约束越多) 开始一看那就哈希处理然后暴力枚举循环节,然后按照循环节长度暴力向后比较,本地测试40,洛谷60 #include<b ...
- bzoj 3916 暴力哈希
暴力的哈希,注意: 将一个串当作另一个串的前缀,需要乘上p[len],len=后面串的长度 这是自己的代码,拿数据在本地测A掉了,但是bz上wa了??bz换数据了难道?? #include<cs ...
- bzoj 3507 DP+哈希
[Cqoi2014]通配符匹配 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 541 Solved: 235[Submit][Status][Dis ...
随机推荐
- git删除远程分支和本地分支
问题描述: 当我们集体进行项目时,将自定义分支push到主分支master之后,如何删除远程的自定义分支呢 问题解决: (1)使用命令git branch -a 查看所有分支 ...
- Memcached使用
一.Memcached简介 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网 ...
- Linux命令 + Shell
1. 之前利用Ubuntu14.10的镜像安装了个虚拟机,本以为自己在windows上的就是管理员的权限,就理所当然的认为虚拟的Linux系统也是root权限.而且虽然@符号前的的标识不是root,但 ...
- poi生成excel
转自:http://www.cnblogs.com/bmbm/archive/2011/12/08/2342261.html 1.首先下载poi-3.6-20091214.jar,下载地址如下: ht ...
- C#顺序表(数据结构)
xmfdsh我近来心情实在不好,只因为这两天课比较少,然后一下子时间太多,不知道干什么,心情郁闷......这是要闹哪样?这都让我一个郁闷了一个晚上.闲来无聊,回顾下之前学的C#数据结构,数据结构的重 ...
- 后缀树系列一:概念以及实现原理( the Ukkonen algorithm)
首先说明一下后缀树系列一共会有三篇文章,本文先介绍基本概念以及如何线性时间内构件后缀树,第二篇文章会详细介绍怎么实现后缀树(包含实现代码),第三篇会着重谈一谈后缀树的应用. 本文分为三个部分, 首先介 ...
- SGU 104
104. Little shop of flowers time limit per test: 0.25 sec. memory limit per test: 4096 KB PROBLEM Yo ...
- SQL技术内幕-10 in和exists 性能比较
in和exists in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询. 一直以来认为exists比in效率高的说法是不准确的. 如果查询的两 ...
- c# string.Format用法总结
文章出处:http://www.cnblogs.com/7788/archive/2009/05/13/1455920.html 先举几个简单的应用案例: 1.格式化货币(跟系统的环境有关,中文系统默 ...
- ECharts案例教程1
原文:http://blog.csdn.net/whqet/article/details/42703973 简介 ECharts,缩写来自Enterprise Charts,商业级数据图表,是百度的 ...