矩阵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;
}