您的位置:首页 > 其它

[bzoj2462] [BeiJing2011]矩阵模板

2016-03-21 14:13 393 查看
  二维的hash。。

  注意n的范围是1000........

  真相似乎是全部输出1就行了233

#include<cstdio>
#include<iostream>
#include<cstring>
#define ull unsigned long long
using namespace std;
const int maxn=1013;
const int modd=23333333;
ull pre[maxn][maxn],v[maxn][maxn],jc[maxn];
int n,m,a,b,q;
char s[maxn];
bool u[23333333];

int main(){
register int i,j,k;
scanf("%d%d%d%d",&n,&m,&a,&b);
for(i=jc[0]=1;i<=m;i++)jc[i]=jc[i-1]*233;
for(i=1;i<=n;i++){
scanf("%s",s+1);
for(j=1;j<=m;j++)pre[i][j]=pre[i][j-1]*233+s[j];
if(i==a)
for(j=b;j<=m;j++)
for(k=1;k<=i;k++)v[i][j]=v[i][j]*233+pre[k][j]-pre[k][j-b]*jc[b];
else if(i>a)
for(j=b;j<=m;j++)v[i][j]=v[i-1][j]*233+pre[i][j]-pre[i][j-b]*jc[b]-(pre[i-a][j]-pre[i-a][j-b]*jc[b])*jc[a];
}
for(i=1;i<=n;i++)for(j=1;j<=m;j++)u[v[i][j]%modd]=1;
scanf("%d",&q);
while(q--){
ull now=0,now1;
for(i=1;i<=a;i++){
scanf("%s",s+1);
for(now1=0,j=1;j<=b;j++)now1=now1*233+s[j];
now=now*233+now1;
}
bool flag=u[now%modd];
//for(i=a;i<=n&&!flag;i++)for(j=b;j<=m;j++)if(v[i][j]==now){flag=1;break;}
puts(flag?"1":"0");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: