zoukankan      html  css  js  c++  java
  • 1567: [JSOI2008]Blue Mary的战役地图

    二分+哈希

    #include<bits/stdc++.h>
    using namespace std;
    long long n,a[52][52],b[52][52],tail1,tail2,sum;
    unsigned long long q1[3000],q2[3000];
    bool work(long long p)
    {
    	tail1=0;
    	for(int i=1;i<=n-p+1;i++)
    	{
    		for(int j=1;j<=n-p+1;j++)
    		{
    			tail1++;
    			q1[tail1]=0;
    			for(int k=1;k<=p;k++)
    			{
    				for(int l=1;l<=p;l++)
    				{
    					q1[tail1]*=13331;q1[tail1]+=a[k+i-1][l+j-1];
    				}
    			}
    		}
    	}
    	tail2=0;
    	for(int i=1;i<=n-p+1;i++)
    	{
    		for(int j=1;j<=n-p+1;j++)
    		{
    			tail2++;
    			q2[tail2]=0;
    			for(int k=1;k<=p;k++)
    			{
    				for(int l=1;l<=p;l++)
    				{
    					q2[tail2]*=13331;q2[tail2]+=b[k+i-1][l+j-1];
    				}
    			}
    		}
    	}
    	sort(q1+1,q1+tail2+1);
    	sort(q2+1,q2+tail2+1);
    	sum=tail2;tail1=1;tail2=1;
    	while(tail1<=sum&&tail2<=sum)
    	{
    		if(q1[tail1]==q2[tail2])return true;
    		if(q1[tail1]<q2[tail2])tail1++;
    		else tail2++;
    	}
    	return false;
    }
    int main()
    {
    	scanf("%lld",&n);
    	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%lld",&a[i][j]);
    	for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%lld",&b[i][j]);
    	long long l=0,r=n,mid;
    	while(l+1<r)
    	{
    		mid=(l+r)/2;
    		if(work(mid))l=mid;
    		else r=mid-1;
    	}
    	if(work(r))printf("%lld
    ",r);
    	else printf("%lld
    ",l);
    	return 0;
    }
    

      

  • 相关阅读:
    IOS 模块并且发布到NPM
    处理npm publish报错问题
    IOS 应用发布流程
    《温故而知新》JAVA基础八
    Beta冲刺 (5/7)
    Beta冲刺 (4/7)
    Beta冲刺 (3/7)
    Beta冲刺 (2/7)
    软件测试(团队)
    福大软工 · BETA 版冲刺前准备(团队)
  • 原文地址:https://www.cnblogs.com/mybing/p/9083461.html
Copyright © 2011-2022 走看看