博客
关于我
《ybtoj高效进阶》第二部分第二章例题5 子正方形
阅读量:332 次
发布时间:2019-03-04

本文共 1312 字,大约阅读时间需要 4 分钟。

题目大意

给2个正方形,求最大公共子正方形的边长。

2个正方形边长<=50

思路

显然可以通过二维hash+二分答案+暴力枚举达到目的

code:

#include
#include
#include
#include
using namespace std;int a[1001][1001],b[1001][1001],ans;int n,m;unsigned long long ha[1001][1001],hb[1001][1001],p[1001],p2[1001];//数组开大又不会死bool check(int x,int y,int l){ if (x>n||y>m||x
n||yy>m) continue; bb=hb[xx][yy]-hb[xx][yy-l]*p[l]-hb[xx-l][yy]*p2[l]+hb[xx-l][yy-l]*p[l]*p2[l]; if (bb==aa) return 1; } } return 0;}int main(){ cin>>n; m=n; for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { cin>>a[i][j]; } } for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { cin>>b[i][j]; } } p2[0]=p[0]=1; for (int i=1;i<=1000;i++) p[i]=97*p[i-1],p2[i]=13331*p2[i-1]; for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { ha[i][j]=ha[i][j-1]*97+a[i][j]; hb[i][j]=hb[i][j-1]*97+b[i][j]; } } for (int i=2;i<=n;i++) { for (int j=1;j<=m;j++) { ha[i][j]=ha[i-1][j]*13331+ha[i][j]; hb[i][j]=hb[i-1][j]*13331+hb[i][j]; } } for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { int l=1,r=n+m,mn=0; while (l<=r) { int mid=(l+r)>>1; if (check(i+mid,j+mid,mid*2+1)) l=mid+1,mn=max(mn,mid*2+1); else r=mid-1; } ans=max(ans,mn); l=1,r=n+m,mn=0; while (l<=r) { int mid=(l+r)>>1; if (check(i+mid,j+mid,mid*2)) l=mid+1,mn=max(mn,mid*2); else r=mid-1; } ans=max(ans,mn); } } cout<

转载地址:http://zcye.baihongyu.com/

你可能感兴趣的文章
记一次讲故事机器人的开发-我有故事,让机器人来读
查看>>
从Linux源码看Socket(TCP)的listen及连接队列
查看>>
高德网络定位算法的演进
查看>>
高德算法工程一体化实践和思考
查看>>
为亿级用户的美好出行而战!高德地图首届算法大赛落幕 95后北邮在读博士带队夺冠
查看>>
重温网络编程——常识(三)
查看>>
判断一个数是否是2的幂
查看>>
js 闭包(新)
查看>>
vscode 编辑python 如何格式化
查看>>
正则表达针对html(九)
查看>>
seo 回忆录百度基本概念(一)
查看>>
重新整理数据结构与算法(c#)—— 算法套路二分法[二十四]
查看>>
不一样的备忘录模式(设计模式十六)
查看>>
【golang-GUI开发】qt之signal和slot(一)
查看>>
kettle 执行 kjb 临时文件夹 /tmp permission denied 问题
查看>>
Markdown使用笔记
查看>>
「从零单排HBase 06」你必须知道的HBase最佳实践
查看>>
「从零单排canal 04」 启动模块deployer源码解析
查看>>
用ThreadLocal来优化下代码吧
查看>>
netcore中使用session
查看>>