1. 程式人生 > 實用技巧 >P4398 [JSOI2008]Blue Mary的戰役地圖(二維雜湊)

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; }
View Code