zoukankan      html  css  js  c++  java
  • Luogu P4398 [JSOI2008]Blue Mary的战役地图 矩阵哈希

    其实可以二分矩阵边长但是我太懒了$qwq$。

    把每个子矩阵扔到$map$里,然后就没了

    #include<cstdio>
    #include<map>
    #include<iostream>
    #define ull unsigned long long
    #define R register int
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    } const int B=11,B2=13,N=51;
    map<ull,bool> mp;
    int n;
    ull p[N],p2[N],a[N][N];
    inline ull calc(int x,int y,int l) {return a[x][y]-a[x-l][y]*p2[l]-a[x][y-l]*p[l]+a[x-l][y-l]*p[l]*p2[l];}
    signed main() {
        n=g(); p[0]=p2[0]=1; for(R i=1;i<=n;++i) p[i]=p[i-1]*B; for(R i=1;i<=n;++i) p2[i]=p2[i-1]*B2;
        for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) a[i][j]=g();
        for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) a[i][j]=a[i][j-1]*B+a[i][j];
        for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) a[i][j]=a[i-1][j]*B2+a[i][j];
        for(R l=0;l<n;++l) for(R i=l;i<=n;++i) for(R j=l;j<=n;++j) mp[calc(i,j,l)]=true;
        for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) a[i][j]=g();
        for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) a[i][j]=a[i][j-1]*B+a[i][j];
        for(R i=1;i<=n;++i) for(R j=1;j<=n;++j) a[i][j]=a[i-1][j]*B2+a[i][j];
        for(R l=n;l;--l) for(R i=l;i<=n;++i) for(R j=l;j<=n;++j) if(mp.find(calc(i,j,l))!=mp.end()) {printf("%d
    ",l); return 0;}
    }

    2019.07.11

  • 相关阅读:
    HashTable、HashSet和Dictionary的区别
    CCF_ 201312-3_最大的矩形
    CCF_ 201312-2_ISBN号码
    CCF_201312-1_出现次数最多的数
    CCF_ 201509-2_日期计算
    CCF_ 201512-3_画图
    CCF_ 201512-2_消除类游戏
    CCF_ 201409-2_画图
    CCF_201409-1_相邻数对
    CCF_ 201412-1_门禁系统
  • 原文地址:https://www.cnblogs.com/Jackpei/p/11170753.html
Copyright © 2011-2022 走看看