您的位置:首页 > 其它

【bzoj2462】[BeiJing2011]矩阵模板

2016-07-23 19:49 288 查看
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;

#define MAXN 100000000
#define prime1 9983543
#define prime2 9804799
#define MOD 99999971
#define N 1010

int m,n,A,B,q;

unsigned int hash;

unsigned int a

,b

,p1
,p2
;
bool h[MAXN];

int main()
{
scanf("%d%d%d%d",&m,&n,&A,&B);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
scanf("%1d",&a[i][j]);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
a[i][j]+=a[i-1][j]*prime1;
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++)
a[i][j]+=a[i][j-1]*prime2;
p1[0]=1;
p2[0]=1;
for (int i=1;i<=min(m,n);i++)
p1[i]=p1[i-1]*prime1,p2[i]=p2[i-1]*prime2;
for (int i=A;i<=m;i++)
for (int j=B;j<=n;j++)
{
hash=a[i][j];
hash-=a[i-A][j]*p1[A];
hash-=a[i][j-B]*p2[B];
hash+=a[i-A][j-B]*p1[A]*p2[B];
hash%=MOD;
h[hash]=1;
}
scanf("%d",&q);
while (q--)
{
for (int i=1;i<=A;i++)
for (int j=1;j<=B;j++)
scanf("%1d",&b[i][j]);
for (int i=1;i<=A;i++)
for (int j=1;j<=B;j++)
b[i][j]+=b[i-1][j]*prime1;
for (int i=1;i<=A;i++)
for (int j=1;j<=B;j++)
b[i][j]+=b[i][j-1]*prime2;
puts(h[b[A][B]%MOD] ? "1" : "0");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: