【hash】Codeforces 958A2 Death Stars (medium)

题面在这里

暴力枚举位置,用hash\(O(m)\)判断两个矩阵是否相等即可

时间复杂度\(O(n^2m)\)

示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include<cstdio>

const int maxn=2005;
typedef unsigned long long ull;
int n,m;
char a[maxn][maxn],b[maxn][maxn];
ull hsha[maxn],hshb[maxn][maxn];
ull hash(char *s){
ull res=0;
for (int i=0;i<m;i++) res=res*29+s[i]-'a'+1;
return res;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%s",a[i]+1);
for (int i=1;i<=m;i++) scanf("%s",b[i]+1);
for (int i=1;i<=n;i++) hsha[i]=hash(a[i]+1);
for (int i=1;i<=m;i++)
for (int j=1;j<=n-m+1;j++) hshb[i][j]=hash(b[i]+j);
for (int i=1;i<=n-m+1;i++)
for (int j=1;j<=n-m+1;j++){
bool suc=1;
for (int k=0;k<m;k++)
if (hsha[i+k]!=hshb[1+k][j]) {suc=0;break;}
if (suc) return printf("%d %d",i,j),0;
}
return 0;
}