• 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
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    SQL Server 通用分页存储过程
    SQL 分页通用存储过程
    python 获取本机IP的三种方式
    Python代码打印出9*9 九九乘法表
    python进程.线程和协程的总结
    5.__魔法方法__开会喽
    css干货部分
    html干货部分
    pyinstaller 打包exe可执行文件
    3_3.黏包现象
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13574184.html
Copyright © 2020-2023  润新知