zoukankan      html  css  js  c++  java
  • bzoj 1567: [JSOI2008]Blue Mary的战役地图【二分+hash】

    二维哈希+二分
    说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可
    只要base选的妙(闭眼随便敲一个数),单模数unsigned long long自然溢出也能过

    #include<iostream>
    #include<cstdio>
    #include<map>
    using namespace std;
    const int N=55;
    int n,a[2][N][N];
    unsigned long long b[N],f[2][N][N],h[5005];
    map<unsigned long long,bool>mp;
    int clc(int t,int x,int y,int l)
    {
    	unsigned long long r=1;
    	for(int i=x;i<=x+l-1;i++)
    		r=(r*3454+f[t][i][y+l-1]-f[t][i][y-1]*b[l]);
    	return r;
    }
    bool ok(int x)
    {
    	mp.clear();
    	for(int i=1;i<=n-x+1;i++)
    		for(int j=1;j<=n-x+1;j++)
    			mp[clc(0,i,j,x)]=1;
    	for(int i=1;i<=n-x+1;i++)
    		for(int j=1;j<=n-x+1;j++)
    			if(mp[clc(1,i,j,x)])
    				return 1;
    	return 0;
    }
    int main()
    {
    	b[0]=1;
    	for(int i=1;i<=50;i++)
    		b[i]=b[i-1]*4322;
    	scanf("%d",&n);
    	for(int k=0;k<=1;k++)
    		for(int i=1;i<=n;i++)
    			for(int j=1;j<=n;j++)
    				scanf("%d",&a[k][i][j]);
        for(int k=0;k<=1;k++)
    		for(int i=1;i<=n;i++)
    		{
    			f[k][i][0]=1;
    			for(int j=1;j<=n;j++)
    				f[k][i][j]=f[k][i][j-1]*4322+a[k][i][j];
    		}
    	int l=1,r=n,ans=0;
    	while(l<=r)
    	{
    		int mid=(l+r)>>1;
    		if(ok(mid))
    			l=mid+1,ans=mid;
    		else 
    			r=mid-1;
    	}
    	printf("%d",ans);
    	return 0;
    }
    
  • 相关阅读:
    Vue框架之基础知识
    Vue框架之初识
    Django组件之modelformset
    Django之小结
    Django组件之modelform
    Django之form表单详解
    jquery基础知识2
    jQuery基础知识1
    js基础知识4
    js基础知识3
  • 原文地址:https://www.cnblogs.com/lokiii/p/9605961.html
Copyright © 2011-2022 走看看