`
xxx0624
  • 浏览: 31687 次
文章分类
社区版块
存档分类
最新评论

POJ3690+位运算

 
阅读更多
/*
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 = 1005;
const int maxm = 55;
const int inf = 0x7fffffff;
const double pi=acos(-1.0);
const double eps = 1e-8;

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=0;i<=m;i++ )
		sum[0][i] = 0;
	for( int i=0;i<=n;i++ )
		sum[i][0] = 0;
	for( int i=1;i<=n;i++ ){
		for( int j=1;j<=m;j++ ){
			sum[ i ][ j ] = sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1];
			if( mat[i][j]=='*' ) 
				sum[i][j] ++;
		}
	}	
	memset( A,0,sizeof( A ) );
	for( int i=1;i<=n;i++ ){
		for( int j=1;j<=q;j++ ){
			if( mat[i][j]=='*' )
				A[i][q] |= ((1LL)<<(j-1));
		}
	}
	for( int i=1;i<=n;i++ ){
		for( int j=q+1;j<=m;j++ ){
			if( mat[i][j-q]=='*' ) A[i][j] = A[i][j-1]-(1LL);
			else A[i][j] = A[i][j-1];
			A[i][j] = A[i][j]>>(1LL);
			if( mat[i][j]=='*' )
				A[i][j] |= ((1LL)<<(q-1));
		}
	}
}

void GetBinary( int p,int q ){
	for( int i=1;i<=p;i++ ){
		AA[ i ] = 0;
		for( int j=1;j<=q;j++ ){
			if( tmp[i][j]=='*' )
				AA[ i ] |= ((1LL)<<(j-1));
		}
	}
}
		
int Judge( int n,int m,int p,int q,int64 cnt ){
	for( int i=1;i+p-1<=n;i++ ){
		if( sum[n][m]-sum[i-1][m]<cnt ) break;
		for( int j=q;j<=m;j++ ){
			bool f = true;
			for( int k=1;k<=p;k++ ){
				if( AA[k]!=A[i+k-1][j] ){
					f = false;
					break;
				}
			}
			if( f==true ) return 1;
		}
	}
	return 0;
}
		
int main(){
	int n,m,t,p,q;
	int Case = 1;
	while( scanf("%d%d%d%d%d",&n,&m,&t,&p,&q)==5 ){
		if( n+m+t+p+q==0 ) break;
		for( int i=1;i<=n;i++ ){
			scanf("%s",mat[i]+1);
		}
		init( n,m,p,q );
		int ans = 0;
		while( t-- ){
			int64 cnt = 0;
			for( int i=1;i<=p;i++ ){
				scanf("%s",tmp[i]+1);
				for( int j=1;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 0;
}


分享到:
评论

相关推荐

    POJ中缀-后缀-四则运算

    人们熟悉的四则运算表达式称为中缀表达式,例如(23+34*45/(5+6+7))。在程序设计语言中,可以利用堆栈的方法把中缀表达式转换成保值的后缀表达式(又称逆波兰表示法),并最终变为计算机可以直接执行的指令,得到...

    POJ1753-Flip Game

    1. **位运算**:可以利用位运算快速处理棋盘状态的变化。每个棋盘的状态可以用一个整数表示,其中每一位代表一个方格的颜色。翻转一行或一列对应的操作可以转化为位操作,如异或(XOR)等。 2. **广度优先搜索**:...

    POJ2965-The Pilots Brothers' refrigerator

    在提供的代码文件中,"POJ2965-The Pilots Brothers' refrigerator(DFS+enum).cpp" 应该是使用DFS和枚举实现的解决方案,而 "POJ2965-The Pilots Brothers' refrigerator(DFS+Bit).cpp" 是使用DFS和位运算的版本。...

    poj题目分类

    * 同余模运算:例如 poj2635、poj3292、poj1845、poj2115。 3. 计算方法: * 二分法求解单调函数相关知识:例如 poj3273、poj3258、poj1905、poj3122。 计算几何学 1. 几何公式。 2. 叉积和点积的运用:例如 ...

    POJ入门题库(含解题思路和答案)

    14. POJ——2701 与 7 无关的数:可能需要对数进行位运算,找出所有不含数字7的数。 15. POJ——2702 密码翻译:涉及到字符串处理和编码解码,可能需要实现一个简单的加密解密算法。 16. POJ——2703 骑车与走路:...

    POJ1426-Find The Multiple【BFS+同余模】

    【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...

    ACM-POJ 算法训练指南

    1. **状态压缩动态规划**:通过位运算来表示状态,优化空间和时间复杂度(poj1837, poj1276)。 ### 六、几何算法 1. **凸包**:构建点集的凸包(poj3267, poj1836, poj1260, poj2533)。 2. **线段交**:计算线段...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:特殊优化技巧通常涉及特定问题的优化算法,如位运算、快速幂等。 ### 总结 POJ平台上的题目涵盖了广泛的技术领域,包括算法、数据结构、动态规划、组合数学等多个方面。通过对这些题目的练习,不仅...

    POJ1840-Eqs

    9. **位运算**:对于效率要求高的题目,位运算技巧可以提高代码运行速度。 10. **记忆化搜索**:当动态规划问题规模较大时,使用记忆化搜索可以避免重复计算,提高效率。 在实际的解题过程中,参赛者需要阅读题目...

    极角排序:POJ 1696(叉积+深搜)

    在POJ 1696这个编程题目中,很可能需要解决与极角排序相关的问题。POJ(Problem Online Judge)是一个在线的编程竞赛平台,它提供了许多编程题目供参赛者解决,以提升编程能力和算法理解。 描述中提到的“叉积+深搜...

    POJ1584-A Round Peg in a Ground Hole

    2. 位运算:在某些解法中,可能会利用位运算来快速比较两个整数的相对大小,例如将两个半径转换为二进制形式,然后通过位运算判断木栓半径是否小于或等于孔洞半径。 3. 条件判断:程序中会包含一系列条件语句,如if...

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...

    poj各种分类

    标题和描述中的“poj各种分类”主要指向的是在POJ(Peking University Online Judge)平台上,根据解题策略和算法类型对题目进行的分类。POJ作为一个知名的在线编程平台,提供了大量的算法练习题,适合从初学者到...

    POJ1321-Chess Problem

    4. **位运算**:在处理棋盘上的棋子布局时,位运算能高效地进行棋子状态的更新和查询。 5. **贪心算法**:对于一些局部最优的选择,可以采用贪心策略逐步构建全局解。 6. **回溯法**:当问题具有很多解且可以通过...

    acm训练计划(poj的题)

    - (poj1837, poj1276):通过位运算来压缩状态,从而减少内存占用。 2. **背包问题**: - (poj3267, poj1836, poj1260, poj2533):零一背包、完全背包等问题的解决方案。 3. **二维动态规划**: - (poj3176, poj...

    POJ1936-All in All

    4. **编程技巧**:例如,循环优化、递归处理、位运算、贪心策略等,这些技巧在编写高效代码时非常关键。 5. **调试与测试**:在POJ上提交代码前,通常需要进行本地调试,确保代码在各种边界条件和测试用例下都能...

    POJ3349-Snowflake Snow Snowflakes

    总的来说,POJ3349“Snowflake Snow Snowflakes”是一个涉及几何、位运算和组合优化的有趣问题,它要求程序员具备扎实的算法基础和良好的编程习惯,同时也锻炼了他们在面对复杂问题时的分析和解决问题的能力。...

    POJ题目简单分类(ACM)

    - **数论**:涵盖素数、整除、进制和同余模运算,如poj2635。 - **计算方法**:如二分法求解单调函数,如poj3273。 7. **计算几何**: - **几何公式**:用于解决几何问题。 - **叉积与点积**:辅助判断线段相交...

    POJ1207-The 3n + 1 problem

    此外,对于大型数据,还可以考虑使用更高效的数据结构和算法优化,例如二分查找、位运算等。然而,对于POJ1207的规模,上述的简单动态规划方法已经足够高效。 总的来说,解答《POJ1207-The 3n + 1 problem》不仅...

    POJ2305-Basic remains

    6. **效率优化**:虽然这是一道基础题,但考虑到可能的大规模输入,优化算法以提高运行效率仍然是必要的,例如使用位操作或其他高效计算余数的方法。 7. **调试与测试**:在提交代码之前,开发者需要进行本地测试,...

Global site tag (gtag.js) - Google Analytics