题意:给定一个01矩阵。T个询问,每次询问大矩阵中是否存在这个特定的小矩阵。

 /*
64位的位运算!!!
题意:
给定一个01矩阵。T个询问,每次询问大矩阵中是否存在这个特定的小矩阵。
(64位记录状态!!!)
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<math.h>
using namespace std;
typedef long long int64;
//typedef __int64 int64;
typedef pair<int64,int64> PII;
#define MP(a,b) make_pair((a),(b))
const int maxn = ;
const int maxm = ;
const int inf = 0x7fffffff;
const double pi=acos(-1.0);
const double eps = 1e-; char mat[ maxn ][ maxn ];
char tmp[ maxm ][ maxm ];
int64 A[ maxn ][ maxn ];
int64 AA[ maxm ];
int64 sum[ maxn ][ maxn ]; void init( int n,int m,int p,int q ){
for( int i=;i<=m;i++ )
sum[][i] = ;
for( int i=;i<=n;i++ )
sum[i][] = ;
for( int i=;i<=n;i++ ){
for( int j=;j<=m;j++ ){
sum[ i ][ j ] = sum[i][j-]+sum[i-][j]-sum[i-][j-];
if( mat[i][j]=='*' )
sum[i][j] ++;
}
}
memset( A,,sizeof( A ) );
for( int i=;i<=n;i++ ){
for( int j=;j<=q;j++ ){
if( mat[i][j]=='*' )
A[i][q] |= ((1LL)<<(j-));
}
}
for( int i=;i<=n;i++ ){
for( int j=q+;j<=m;j++ ){
if( mat[i][j-q]=='*' ) A[i][j] = A[i][j-]-(1LL);
else A[i][j] = A[i][j-];
A[i][j] = A[i][j]>>(1LL);
if( mat[i][j]=='*' )
A[i][j] |= ((1LL)<<(q-));
}
}
} void GetBinary( int p,int q ){
for( int i=;i<=p;i++ ){
AA[ i ] = ;
for( int j=;j<=q;j++ ){
if( tmp[i][j]=='*' )
AA[ i ] |= ((1LL)<<(j-));
}
}
} int Judge( int n,int m,int p,int q,int64 cnt ){
for( int i=;i+p-<=n;i++ ){
if( sum[n][m]-sum[i-][m]<cnt ) break;
for( int j=q;j<=m;j++ ){
bool f = true;
for( int k=;k<=p;k++ ){
if( AA[k]!=A[i+k-][j] ){
f = false;
break;
}
}
if( f==true ) return ;
}
}
return ;
} int main(){
int n,m,t,p,q;
int Case = ;
while( scanf("%d%d%d%d%d",&n,&m,&t,&p,&q)== ){
if( n+m+t+p+q== ) break;
for( int i=;i<=n;i++ ){
scanf("%s",mat[i]+);
}
init( n,m,p,q );
int ans = ;
while( t-- ){
int64 cnt = ;
for( int i=;i<=p;i++ ){
scanf("%s",tmp[i]+);
for( int j=;j<=q;j++ ){
if( tmp[i][j]=='*' )
cnt++;
}
}
GetBinary( p,q );
ans += Judge( n,m,p,q,cnt );
}
printf("Case %d: ",Case++);
printf("%d\n",ans);
}
return ;
}

POJ3690+位运算的更多相关文章

  1. Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range

    在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...

  2. 简简单单学会C#位运算

    一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...

  3. SQL Server时间粒度系列----第8节位运算以及设置日历数据表节假日标志详解

    本文目录列表: 1.位运算 2.设置日历数据表节假日标志 3.总结语 4.参考清单列表   位运算   SQL Server支持的按位运算符有三个,分别为:按位与(&).按位或(|).按位异或 ...

  4. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  5. Java中的位运算

    昨天去面试的时候做到了一道Java的位运算题目,发现有个运算符不懂:">>>",今天特地查了一下,并小结一下常见的位运算符号: ~  按位非(NOT)(一元运算) ...

  6. C#位运算讲解与示例

    首先每一个权限数都是2的N次方数 如:k1=2 ; //添加 k2=4 ; //删除 k3=8; //修改 ... 如此定义功能权限数,当需要组合权限时,就需要对各个所拥有的权限数按位或了. 如: p ...

  7. C#枚举中的位运算权限分配浅谈

    常用的位运算主要有与(&), 或(|)和非(~), 比如: 1 & 0 = 0, 1 | 0 = 1, ~1 = 0 在设计权限时, 我们可以把权限管理操作转换为C#位运算来处理. 第 ...

  8. Java位运算经典实例

    一 源码.反码.补码 正数的源码.反码.补码相同,例如5:            5的源码:101            5的反码:101            5的补码:101 负数的源码.反码.补 ...

  9. C入门---位运算

    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算直接对整数在内存中的二进制位进行操作.由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. (1),与(&)运算 ...

随机推荐

  1. 第二十九篇、UICollectionView瀑布流

    1.实现思路 >第一种方案:UIScrollView 镶嵌三个UITableView (不推荐使用) >第二种方案:UIScrollView 镶嵌UIImageView (需要解决循环利用 ...

  2. RSS订阅推荐

    科技新闻 虎嗅网 http://www.huxiu.com/ 科技博客的新生力量,文章以观点鲜明出名: 36氪  http://www.36kr.com/ 科技博客,关注创业,可以免费发表创业公司新闻 ...

  3. Bootstrap 标签的变体 实例样式

    Bootstrap 标签样式,代码如下: <!DOCTYPE html> <html> <head> <title>Bootstrap 实例 - 标签的 ...

  4. (转)JVM参数调优八大技巧

    这里和大家分享一下JVM参数调优的八条经验,JVM参数调优,这是很头痛的问题,设置的不好,JVM不断执行FullGC,导致整个系统变得很慢,网站停滞时间能达10秒以上,相信通过本文的学习你对JVM参数 ...

  5. js笔记——浏览器及版本判断

    判断IE浏览器的时候注意需要做两个判断 一个是msie 一个是Edge function myBrowser(){ var userAgent = navigator.userAgent; //取得浏 ...

  6. PHP中的变量

    PHP中的变量 程序是由代码与数据两部分组成,数据存储在变量,变量的本质是内存中的一个存储空间.变量对应的空间有一个名子,叫变量名,变量名用于对数据进行读写. 变量的定义 在php变量名之前必须使用' ...

  7. Ubuntu gedit 折叠插件

    Ubuntu Kylin 14.04 gedit  - Version 3.10.4 (as same as all version of gedit 3.x ) Attention: this pl ...

  8. 深度优先算法DFS

    英雄要从H点出发,去解救位于M点的美女. 迷宫的围墙用#表示,带*号的位置表示有杀手埋伏,这些点都是不能走的, 那么英雄要最少走多少步才能解救美女呢? package myalgorithm; imp ...

  9. C#获取“所有用户桌面”的路径

    想用C#得到The All Users Desktop(Public\Desktop)的路径. 原来以为很简单,然而 Environment.GetFolderPath(Environment.Spe ...

  10. 概念:RPG与RPGLE的区别

    RPG是OPM编程模式,即RPG编程的代码不能编译成*MODULE:编译只能直接生成一个程序,*PGM.    RPGLE是ILE编程模式.OS/400环境下,ILE是集成开发环境.在ILE环境下,所 ...