矩阵哈希板子


在一维哈希的基础上用二维前缀和思想

#include
using 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;
}

相关