BZOJ1567 [JSOI2008]Blue Mary的战役地图

来源:互联网 发布:java 新浪短网址生成 编辑:程序博客网 时间:2024/05/15 00:31

枚举答案然后hash判断即可

矩阵就把每一行接一起hash就行了

我用了双模双base,单模单base被卡了

#include<iostream>#include<cstring>#include<cstdlib>#include<cstdio>#include<ctime>#include<algorithm>#include<iomanip>#include<cmath>#include<vector>#include<set>#include<bitset>#include<queue>#include<stack>#include<map>using namespace std;#define MAXN 110#define MAXM 1010#define eps 1e-8#define ll long long#define INF 1000000000#define MOD 1000000007int n;int a[MAXN][MAXN];int b[MAXN][MAXN];map<ll,bool>h[4];ll bas[4]={233,131,233,131};ll mod[4]={1000000007,10000007,10000007,1000000007};ll Ha(int l,int r,int L,int R,int I){int i,j;ll re=0;for(i=l;i<=r;i++){for(j=L;j<=R;j++){re*=bas[I];re+=a[i][j];re%=mod[I];}}return re;}ll Hb(int l,int r,int L,int R,int I){int i,j;ll re=0;for(i=l;i<=r;i++){for(j=L;j<=R;j++){re*=bas[I];re+=b[i][j];re%=mod[I];}}return re;}bool jud(int x){int i,j,k;for(k=0;k<4;k++){h[k].clear();}for(i=x;i<=n;i++){for(j=x;j<=n;j++){for(k=0;k<4;k++){h[k][Ha(i-x+1,i,j-x+1,j,k)]=1;}}}for(i=x;i<=n;i++){for(j=x;j<=n;j++){bool flag=1;for(k=0;k<4;k++){if(!h[k][Hb(i-x+1,i,j-x+1,j,k)]){flag=0;break;}}if(flag){return 1;}}}return 0;}int main(){int i,j,k;scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%d",&a[i][j]);}}for(i=1;i<=n;i++){for(j=1;j<=n;j++){scanf("%d",&b[i][j]);}}for(i=n;i;i--){if(jud(i)){printf("%d\n",i);return 0;}}printf("0\n");return 0;}/**/


0 0