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
没有人不辛苦,只有人不喊疼
原文地址:https://www.cnblogs.com/ctyakwf/p/13574184.html