矩阵hash

矩阵hash

点击查看代码
#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;

const int maxn=1010;
const ull seed1=131;
const ull seed2=13331;

ull h[maxn][maxn],h2[maxn][maxn];
ull p1[maxn],p2[maxn];
char a[maxn][maxn];

void Hash(int n, int m,ull H[][maxn]) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            H[i][j] = (H[i][j - 1] * seed1 + a[i][j]);
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            H[i][j] = (H[i - 1][j] * seed2 + H[i][j]);
        }
    }
}

int main(){
	#ifdef lmj_debug
		freopen("1.in","r",stdin);
	#endif
	p1[0]=p2[0]=1;
	for (int i=1;i<=maxn-5;i++){
		p1[i]=p1[i-1]*seed1;
		p2[i]=p2[i-1]*seed2;
	}
	int n,m;
	cin>>n>>m;
	for (int i=1;i<=n;i++)scanf("%s",a[i]+1);
	Hash(n,m,h);
	int r,c;
	scanf("%d%d",&r,&c);
	for (int i=1;i<=r;i++) scanf("%s",a[i]+1);
	Hash(r,c,h2);
	for (int i=r-1;i<=n;i++){
		for (int j=c-1;j<=m;j++){
			//cout<<h[i][j]<<" ";
			ull tmp = h[i][j] - h[i - r][j] * p2[r] - h[i][j - c] * p1[c] + h[i - r][j - c] * p2[r] * p1[c] ;
			if(tmp==h2[r][c]){
				printf("%d %d\n",i-r,j-c);
			}
		}
		//printf("\n");
	}
	return 0;
}
posted @ 2022-04-04 14:42  lmj_1  阅读(40)  评论(0)    收藏  举报