BZOJ 1567 [JSOI2008]Blue Mary的戰役地圖【二分答案】
阿新 • • 發佈:2018-11-08
直接二分答案暴力列舉。
看到其他題解說需要用雜湊存一下矩陣但是實際上沒有必要。
儘管暴力列舉的時間複雜度十分高但是實際上我們在驗證的時候會減掉許多不存在的情況:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define db double #define sg string #define ll long long #define rel(i,x,y) for(ll i=(x);i<(y);i++) #define rep(i,x,y) for(ll i=(x);i<=(y);i++) #define red(i,x,y) for(ll i=(x);i>=(y);i--) using namespace std; const ll N=1e2+5; const ll Inf=1e18; ll n,a[N][N],b[N][N]; inline ll read() { ll x=0;char ch=getchar();bool f=0; while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?-x:x; } bool check(ll len) { rep(x1,1,n+1-len) rep(y1,1,n+1-len) { rep(x2,1,n+1-len) rep(y2,1,n+1-len) { ll flag=1; rel(i,0,len) { rel(j,0,len) { if(a[x1+i][y1+j]!=b[x2+i][y2+j]) { flag=0;break; } } if(!flag) break; } if(flag) return true; } } return false; } int main() { n=read(); rep(i,1,n) rep(j,1,n) a[i][j]=read(); rep(i,1,n) rep(j,1,n) b[i][j]=read(); ll ans=0,l=1,r=n; while(l<=r) { ll mid=l+r>>1; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; } printf("%lld\n",ans); return 0; }