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 }
- 设计模式专题(四)——代理模式
- Array数组函数(一)
- ASP.NET AJAX(5)__JavaScript原生类型以及Microsoft AJAX Library什么是Microsoft AJAX LibraryObject原生类型Object.pro
- 使用 Octave 来学习 Machine Learning(一)
- ASP.NET AJAX(4)__客户端访问WebService服务器端释放WebService方法客户端访问WebService客户端访问PageMethod错误处理复杂数据类型使用基础客户端代理的
- 讲真,你该做备份的有效性校验了
- memcache安装方法
- 设计模式专题(五)——工厂方法模式
- ASP.NET AJAX(11)__ScriptManagerUpdatePanel的支持成员功能控制成员脚本控件支持成员ScriptMode和ScriptPathLoadScriptsBeforeU
- SQL Server 2016新特性:动态数据屏蔽(DDM)
- ASP.NET AJAX(12)__浏览器兼容功能判断浏览器的类型和版本Sys.Browser针对DOM元素的兼容操作针对DOM事件的兼容操作
- 设计模式专题(六)——原型模式
- ASP.NET AJAX(13)__利用Microsoft AJAX Library开发客户端组件Sys.Component成员Sys.IDisposable成员Sys.INotifyDisposin
- 设计模式专题(七)——建造者模式
- 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 数组属性和方法
- 一、html 基础
- 二、css3基础
- 三. CSS layout(布局)
- 四. css 布局之 float
- Python+selenium 自动化-读取excel记录的脚本执行登陆操作实战演示
- 详细讲解!从JVM直到类加载器
- PyQt5 图形界面-实现按钮监听事件
- Python 技术篇-文件操作:文件的读取和写入
- Salesforce Javascript(一) Promise 浅谈
- Python 技巧篇-英文单词首字母大小写转换功能实例演示,字符串切片实现
- 5千字的SpringMVC总结,我觉得你会需要
- 【原创】Java并发编程系列36 | FutureTask
- React Hooks-useTypescript!
- spring-boot项目优雅的http客户端工具,真香!
- 人人都可以学会生存分析(学徒数据挖掘)