矩阵hash


矩阵hash

点击查看代码
#include 
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<