设为首页 加入收藏

TOP

POJ3690+位运算
2014-11-23 20:25:30 来源: 作者: 【 】 浏览:8
Tags:POJ3690 +位 运算
/*
64位的位运算!!!
题意:
给定一个01矩阵。T个询问,每次询问大矩阵中是否存在这个特定的小矩阵。
(64位记录状态!!!)
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long int64;
//typedef __int64 int64;
typedef pair 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] 
 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇为文字加背景色ATL 下一篇1019. General Palindromic Numbe..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)
·超长干货:Python实 (2025-12-26 21:51:14)
·为什么 Java 社区至 (2025-12-26 21:19:10)
·Java多线程阻塞队列 (2025-12-26 21:19:07)