RE求助
查看原帖
RE求助
930076
mmdxmakioi楼主2023/2/2 11:22

基本根据第一篇题解来的

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define int unsigned long long
int n,m,a,b,T;
char s[1201][1201];
const int u1 = 131;
const int u2 = 13331;
int pow1[1201];
int pow2[1201];
int f[1201][1201];
int Hash(int n,int m,int s,int l)
{
	return f[s][l]-f[n-1][l]*pow1[s-n+1]-f[s][m-1]*pow2[l-m+1]+f[n-1][m-1]*pow1[s-n+1]*pow2[l-m+1];
}
int S[1200001];
int cnt;
signed main()
{
	cin>>T;
	while(T--)
	{
		
	//	printf("%ull\n",T);
		cin>>n>>m;
		int i,j;
		for(i=1;i<=n;i++)
		{
			cin>>s[i]+1;
		}
		cin>>a>>b;
		pow1[0] = 1;
		pow2[0] = 1;
		for(i=1;i<=n;i++)
		{
			pow1[i] = pow1[i-1]*u1;
		}
		for(i=1;i<=m;i++)
		{
			pow2[i] = pow2[i-1]*u2;
		}
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				f[i][j] = f[i-1][j]*u1 + f[i][j-1] * u2 +(s[i][j]-'a') -f[i-1][j-1]*u1*u2;
			}
		}
		cnt = 0;
		for(i=1;i<=n-a+1;i++)
		{
			for(j=1;j<=m-b+1;j++)
			{
				S[++cnt] = Hash(i,j,i+a-1,j+b-1);
			}
		}
		sort(S+1,S+cnt+1);
		for(i=1;i<=a;i++)
		{
			cin>>s[i]+1;
		}
		for(i=1;i<=a;i++)
		{
			for(j=1;j<=b;j++)
			{
				f[i][j] = f[i-1][j]*u1 + f[i][j-1] * u2 +(s[i][j]-'a') -f[i-1][j-1]*u1*u2;
			}
		}
		cout<<upper_bound(S+1,S+cnt+1,f[a][b])-lower_bound(S+1,S+cnt+1,f[a][b])<<endl;
	}
}
2023/2/2 11:22
加载中...