P4398 [JSOI2008]Blue Mary的战役地图(二维哈希)
算法比较明显,二维hash用map判断即可,因为数据很小,因此不用过多考虑优化
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; const int N=5e5+10; const int inf=0x3f3f3f3f; const int mod=1e9+7; int base1=131,base2=13131; int a[100][100]; int b[100][100]; ull hash1[100][100]; ull hash2[100][100]; ull hash3[100][100]; ull hash4[100][100]; int n; ull p1[N],p2[N]; map<ull,int> m1; void init(){ int i; p1[0]=1,p2[0]=1; for(i=1;i<555;i++){ p1[i]=p1[i-1]*base1; p2[i]=p2[i-1]*base2; } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ hash1[i][j]=hash1[i][j-1]*base1+a[i][j]; hash2[i][j]=hash2[i-1][j]*base2+hash1[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ hash3[i][j]=hash3[i][j-1]*base1+b[i][j]; hash4[i][j]=hash4[i-1][j]*base2+hash3[i][j]; } } } ull cal(int i,int j,int x){ ull tmp=hash2[i+x-1][j+x-1]; tmp-=hash2[i+x-1][j-1]*p1[x]; tmp-=hash2[i-1][j+x-1]*p2[x]; tmp+=hash2[i-1][j-1]*p1[x]*p2[x]; return tmp; } ull cal1(int i,int j,int x){ ull tmp=hash4[i+x-1][j+x-1]; tmp-=hash4[i+x-1][j-1]*p1[x]; tmp-=hash4[i-1][j+x-1]*p2[x]; tmp+=hash4[i-1][j-1]*p1[x]*p2[x]; return tmp; } bool check(int x){ int i,j; m1.clear(); for(i=1;i+x-1<=n;i++){ for(j=1;j+x-1<=n;j++){ ull tmp=cal(i,j,x); m1[tmp]++; } } for(i=1;i+x-1<=n;i++){ for(j=1;j+x-1<=n;j++){ ull tmp=cal1(i,j,x); if(m1[tmp]) return true; } } return false; } int main(){ ios::sync_with_stdio(false); cin>>n; int i,j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++) cin>>a[i][j]; } for(i=1;i<=n;i++){ for(j=1;j<=n;j++) cin>>b[i][j]; } init(); int l=0,r=n; while(l<r){ int mid=l+r+1>>1; if(check(mid)) l=mid; else r=mid-1; } cout<<l<<endl; return 0; }
没有人不辛苦,只有人不喊疼