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 ...
随机推荐
- Linux sort --copy
Source: http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html sort是在Linux里非常常用的一个命令,管排序的,集中 ...
- UVA 10078 The Art Gallery
Problem: Century Arts has hundreds of art galleries scattered all around the country and you are hir ...
- Poj2420 A Star not a Tree? 模拟退火算法
题目链接:http://poj.org/problem?id=2420 题目大意:每组数据中给n个点(n<=100),求平面中一个点使得这个点到n个点的距离之和最小. 分析:一开始看到这个题想必 ...
- 笔直的水管 usaco 背包
背包dp入门,需要滚动数组: #include<iostream> #include<cstdio> #include<string> #include<cs ...
- 【转载】c/c++在windows下获取时间和计算时间差的几种方法总结
一.标准C和C++都可用 1.获取时间用time_t time( time_t * timer ),计算时间差使用double difftime( time_t timer1, time_t time ...
- ios kvo
kvo的使用方法: 1.注册: -(void)addObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath options:(NS ...
- css内边距与外边距的区别
你真的了解margin吗?你知道margin有什么特性吗?你知道什么是垂直外边距合并?margin在块元素.内联元素中的区别?什么时候该用 padding而不是margin?你知道负margin吗?你 ...
- javascript设计模式-抽象工厂模式
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 再深入一点ajax
1.建立兼容性强的XHR对象有那么复杂么? 看过一些书,书上为了写针对低版本IE和其他非IE浏览器需要写一大串兼容函数,典型的就是JS高级程序上的. 可是在现实开发中,为了兼容IE6/IE7,只需要这 ...
- ZOJ3550 Big Keng(三分)
题意:给定一个立体的图形,上面是圆柱,下面是圆台,圆柱的底面半径和圆台的上半径相等,然后体积的V时,问这个图形的表面积最小可以是多少.(不算上表面).一开始拿到题以为可以YY出一个结果,就认为它是圆锥 ...