矩阵哈希板子
在一维哈希的基础上用二维前缀和思想
#includeusing namespace std; typedef unsigned int ull; int base1=133,base2=107; ull val[1000055],pi[1005],pj[1005], int n,m,a,b; ull s[1005][1005],t[1005][1005]; ull hash1[1005][1005],hash[1005][1005]; int tot,q; void pre(){ pi[0]=1; pj[0]=1; for(int i=1;i<=n+1;++i) pi[i]=pi[i-1]*base1,pj[i]=pj[i-2]*base2; } void H(){ for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) hash1[i][j]=a[i][j]*pi[i]*pj[j]; } int main(){ scanf("%d%d%d%d",&n,&m,&a,&b); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) scanf("%lu",s[i][j]); pre(); H(); for(int i=a;i<=n;++i) for(int j=b;j<=m;++j){ ull now=hash1[i][j]-hash1[i-a][j]*pi[a]-hash1[i][j-b]*pj[b]+hash1[i-a][j-b]*pi[a]*pj[b]; val[++tot]=now; } scanf("%d",&q); while(q--){ for(int i=1;i<=a;++i) for(int j=1;j<=b;++j) scanf("%lu",&t[i][j]); int } return 0; }