这期主要是字符串hash和字符串dp
选D题的原因主要是想再复习一下二维hash
详细请看我的另一篇博客!
D题(Matrix Matcher)
这是二维字符串hash的典型板子题目。
题目大意:在二维的一个字符串内 查找给定串出现了多少次
既然是板子 就不多说啦
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
typedef unsigned long long ull;
const int maxn = 1010;
ull base1 = 131,base2 = 1331;
char a[maxn][maxn],b[maxn][maxn];
ull hsa[maxn][maxn],hsb[maxn][maxn];
ull p1,p2;
int ans = 0;
int n,m,x,y;
void get_p()
{
p1=1;
p2=1;
for (int i=1;i<=y;i++)
{
p1 *= base1;
}
for (int i=1;i<=x;i++)
{
p2 *= base2;
}
}
void get_ans()
{
ans=0;
for (int i=1;i<=x;i++) {
for (int j=1;j<=y;j++) {
int t=b[i][j]-'a';
hsb[i][j] = t + hsb[i][j-1] * base1 + hsb[i-1][j] * base2;
hsb[i][j]-=hsb[i-1][j-1] * base1 * base2;//二维
}
}
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
int t=a[i][j]-'a';
hsa[i][j] =t + hsa[i][j-1] * base1 + hsa[i-1][j] * base2 ;
hsa[i][j]-=hsa[i-1][j-1] * base1 * base2;
if (i >= x && j >= y)
{
if(hsb[x][y] == hsa[i][j] - hsa[i-x][j] * p2 - hsa[i][j-y] * p1 + hsa[i-x][j-y] * p1 * p2)
ans++;
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
while (T--) {
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
scanf("%s",a[i]+1);
}
scanf("%d%d",&x,&y);
for (int i=1;i<=x;i++)
{
scanf("%s",b[i]+1);
}
get_p();
get_ans();
cout<<ans<<endl;
}
return 0;
}