Wannafly模拟赛 A.矩阵(二分答案+hash)
时间:2022-05-07
本文章向大家介绍Wannafly模拟赛 A.矩阵(二分答案+hash),主要内容包括矩阵、输入描述:、输出描述:、输入、输出、备注:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
矩阵
时间限制:1秒 空间限制:131072K
题目描述
给出一个n * m的矩阵。让你从中发现一个最大的正方形。使得这样子的正方形在矩阵中出现了至少两次。输出最大正方形的边长。
输入描述:
第一行两个整数n, m代表矩阵的长和宽;
接下来n行,每行m个字符(小写字母),表示矩阵;
输出描述:
输出一个整数表示满足条件的最大正方形的边长。
示例1
输入
5 10
ljkfghdfas
isdfjksiye
pgljkijlgp
eyisdafdsi
lnpglkfkjl
输出
3
备注:
对于30%的数据,n,m≤100;
对于100%的数据,n,m≤500;
题目链接:https://www.nowcoder.com/acm/contest/submit/f8363c912a4c48a28b80f47e7102b6b8?ACMContestId=2&tagId=4
思路:二分答案mid,然后检验是否存在两个相同的mid*mid的正方形
检验方法:
首先对于每个位置,求出它开始长度为mid的横行的hash值
然后对于hash值再求一次竖列的hash值
将第二次求出的hash值排序,如果存在两个相同的hash值则可行
下面给出AC代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4 inline ll read()
5 {
6 ll x=0,f=1;
7 char ch=getchar();
8 while(ch<'0'||ch>'9')
9 {
10 if(ch=='-')
11 f=-1;
12 ch=getchar();
13 }
14 while(ch>='0'&&ch<='9')
15 {
16 x=x*10+ch-'0';
17 ch=getchar();
18 }
19 return x*f;
20 }
21 inline void write(ll x)
22 {
23 if(x<0)
24 {
25 putchar('-');
26 x=-x;
27 }
28 if(x>9)
29 write(x/10);
30 putchar(x%10+'0');
31 }
32 char dp[521][521];
33 ll n,m;
34 ll p1[520],p2[520];
35 ll p[555][555];
36 ll h[250010];
37 inline bool checked(ll x)
38 {
39 //
40 for(ll i=1;i<=n;i++)
41 {
42 ll ans=0;
43 for(ll j=1;j<x;j++)
44 {
45 ans=ans*(ll)('a')+dp[i][j];
46 p[i][j]=0;
47 }
48 for(ll j=x;j<=m;j++)
49 {
50 ans=ans*(ll)('a')-p1[x]*dp[i][j-x]+dp[i][j];
51 p[i][j]=ans;
52 }
53 }
54 //
55 ll GG=0;
56 for(ll i=x;i<=m;i++)
57 {
58 ll PP=0;
59 for(ll j=1;j<x;j++)
60 {
61 PP=PP*(ll)('a'+(ll)(('A'+1)/2+1))+p[j][i];
62 }
63 for(ll j=x;j<=n;j++)
64 {
65 PP=PP*(ll)('a'+(ll)(('A'+1)/2+1))-p2[x]*p[j-x][i]+p[j][i];
66 h[GG]=PP;
67 GG++;
68 }
69 }
70 sort(h,h+GG);
71 for(ll i=1;i<GG;i++)
72 {
73 if(h[i-1]==h[i])
74 return true;
75 }
76 return false;
77 }
78 int main()
79 {
80 n=read();
81 m=read();
82 memset(p,0,sizeof(p));
83 for(ll i=1;i<=n;i++)
84 {
85 scanf("%s",dp[i]+1);
86 for(ll j=1;j<=m;j++)
87 {
88 dp[i][j]=dp[i][j]-('a'-1);
89 }
90 }
91 ll l=1;
92 ll r=min(n,m);
93 memset(p1,0,sizeof(p1));
94 memset(p2,0,sizeof(p2));
95 p1[0]=1;
96 p2[0]=1;
97 for(ll i=1;i<=r;i++)
98 {
99 p1[i]=p1[i-1]*(ll)('a');
100 p2[i]=p2[i-1]*(ll)('a'+(ll)(('A'+1)/2+1));
101 }
102 ll mid;
103 ll k;
104 while(l<=r)
105 {
106 mid=(l+r)/2;
107 if(checked(mid))
108 {
109 l=(k=mid)+1;
110 }
111 else
112 r=mid-1;
113 }
114 write(k);
115 return 0;
116 }
- codevs3002 石子归并 3
- 算法模板——计算几何2(二维凸包——Andrew算法)
- 算法模板——splay区间反转 2
- 算法模板——Dinic网络最大流 2
- 1935: [Shoi2007]Tree 园丁的烦恼
- 1339 / 1163: [Baltic2008]Mafia
- 4010: [HNOI2015]菜肴制作
- 4052: [Cerc2013]Magical GCD
- ElasticSearch搜索引擎在SpringBoot中的实践
- 2292: 【POJ Challenge 】永远挑战
- 四边形不等式优化DP
- 4063: [Cerc2012]Darts
- 3997: [TJOI2015]组合数学
- 1349: [Baltic2006]Squint
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 持续集成-Jenkins常用插件安装
- 小白学PyTorch | 15 TF2实现一个简单的服装分类任务
- 小白学PyTorch | 16 TF2读取图片的方法
- 小白学PyTorch | 17 TFrec文件的创建与读取
- 小白学PyTorch | 18 TF2构建自定义模型
- 扩展之Tensorflow2.0 | 19 TF2模型的存储与载入
- 扩展之Tensorflow2.0 | 20 TF2的eager模式与求导
- Django JSONField SQL注入漏洞(CVE-2019-14234)分析与影响
- 扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则
- 持续代码质量管理-SonarQube-7.3部署
- 攻击Scrapyd爬虫
- 【webpack】从vue-cli 2x 到 3x 迁移与实践
- 前端单元测试那些事
- 前端Nginx那些事
- 前端运维部署那些事