思路:以前没做过字符矩阵的哈希,所以这题是看别人博客写的。
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<queue> #include<set> #include<cmath> #include<bitset> #define mem(a,b) memset(a,b,sizeof(a)) #define lson i<<1,l,mid #define rson i<<1|1,mid+1,r #define llson j<<1,l,mid #define rrson j<<1|1,mid+1,r #define INF 0x7fffffff #define seed 13131 #define seed1 1313 #define maxn 1005 typedef long long ll; typedef unsigned long long ull; using namespace std; ull p,Hash[maxn][maxn],Hash1[maxn][maxn]; char s[maxn][maxn],str[105][105]; int n,m,x,y; ull getHash() { ull a,b=0; for(int i=0;i<x;i++) { a=0; for(int j=0;j<y;j++) a=a*seed1+str[i][j]; b=b*seed+a; } return b; } int getAns() { ull base,a; int ans=0; base=1; for(int i=0;i<y;i++) base*=seed1; for(int i=0;i<n;i++) { a=0; for(int j=0;j<y;j++) a=a*seed1+s[i][j]; Hash1[i][y-1]=a; for(int j=y;j<m;j++) Hash1[i][j]=Hash1[i][j-1]*seed1-s[i][j-y]*base+s[i][j]; } base=1; for(int i=0;i<x;i++) base*=seed; for(int i=y-1;i<m;i++) { a=0; for(int j=0;j<x;j++) a=a*seed+Hash1[j][i]; Hash[x-1][i]=a; if(a==p) ans++; for(int j=x;j<n;j++) { Hash[j][i]=Hash[j-1][i]*seed-Hash1[j-x][i]*base+Hash1[j][i]; if(Hash[j][i]==p) ans++; } } return ans; } int main() { //freopen("1.txt","r",stdin); int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) scanf("%s",s[i]); scanf("%d%d",&x,&y); for(int i=0;i<x;i++) scanf("%s",str[i]); p=getHash(); printf("%d\n",getAns()); } return 0; }
时间: 2024-11-05 04:51:45