矩阵哈希
解决的问题:
给出一个大矩阵,再给出若干个小矩阵,问大矩阵中是否存在小矩阵。
代码模板:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed1=131,seed2=13331,maxn=1e5+10,mod=1e9+7;
int n,m,t,x,y;
char a[1004][1004];
ull p1[maxn],p2[maxn];
ull h[1005][1005];
unordered_map<ll,int>mp;
void Hash(int n,int m)//对于某个子矩阵,h[n][m]就代表了这个矩阵的哈希值
{
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]-'a'+1);
}
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()
{
int cas=0;
p1[0]=p2[0]=1;
for(int i=1;i<=1005;i++)
{
p1[i]=p1[i-1]*seed1;
p2[i]=p2[i-1]*seed2;
}
while(~scanf("%d%d%d%d%d",&n,&m,&t,&x,&y))
{
mp.clear();
cas++;
for(int i=1;i<=n;i++)
scanf("%s",a[i]+1);
Hash(n,m);
for(int i=x;i<=n;i++)//以(i,j)为结尾的哈希值
{
for(int j=y;j<=m;j++)
{
ll temp=h[i][j]-h[i-x][j]*p2[x]-h[i][j-y]*p1[y]+h[i-x][j-y]*p2[x]*p1[y];
mp[temp]++;
}
}
int ans=0;
while(t--)
{
for(int i=1;i<=x;i++)
scanf("%s",a[i]+1);
}
Hash(x,y);
if(mp[h[x][y]]) ans++;
printf("Case %d: %d\n", cas, ans);
}
system("pause");
return 0;
}