链接:https://www.nowcoder.com/acm/contest/2/A
来源:牛客网

题目描述

给出一个n * m的矩阵。让你从中发现一个最大的正方形。使得这样子的正方形在矩阵中出现了至少两次。输出最大正方形的边长。

输入描述:

第一行两个整数n, m代表矩阵的长和宽;
接下来n行,每行m个字符(小写字母),表示矩阵;

输出描述:

输出一个整数表示满足条件的最大正方形的边长。

输入例子:
5 10
ljkfghdfas
isdfjksiye
pgljkijlgp
eyisdafdsi
lnpglkfkjl
输出例子:
3

-->

示例1

输入

5 10
ljkfghdfas
isdfjksiye
pgljkijlgp
eyisdafdsi
lnpglkfkjl

输出

3

备注:

对于30%的数据,n,m≤100;
对于100%的数据,n,m≤500;

题解

二分,字符串$hash$。

可以二分答案,然后验证,验证的时候$O(n^2)$效率可以得到每一个正方形的$hash$值,判断一下即可,注意$hash$冲突,用了两次$hash$才过。

#include<bits/stdc++.h>
using namespace std; long long base[2];
long long mod[2];
const int maxn = 500 + 10;
int n, m;
char s[maxn][maxn];
long long b[2][maxn * maxn];
long long sum[2][maxn][maxn];
long long h[2][maxn][maxn];
pair<long long, long long> pi[maxn * maxn]; void init() {
base[0] = 131LL;
base[1] = 313LL;
mod[0] = 1e9 + 7;
mod[1] = 1e9 + 7;
} int check(int x) {
for(int t = 0; t < 2; t ++) {
for(int i = 0; i < n; i ++) {
long long C = 0;
for(int j = 0; j < x; j ++) {
C = C * base[t] % mod[t];
C = (C + s[i][j]) % mod[t];
}
sum[t][i][0] = C;
for(int j = 1; j + x - 1 < m; j ++) {
long long A = sum[t][i][j - 1];
long long B = s[i][j - 1] * b[t][x - 1] % mod[t];
A = (A - B + mod[t]) % mod[t];
A = A * base[t] % mod[t];
A = (A + s[i][j + x - 1]) % mod[t];
sum[t][i][j] = A;
}
}
for(int j = 0; j < m; j ++) {
long long C = 0;
for(int i = 0; i < x; i ++) {
C = C * b[t][x] % mod[t];
C = (C + sum[t][i][j]) % mod[t];
}
h[t][0][j] = C;
}
for(int i = 1; i + x - 1 < n; i ++) {
for(int j = 0; j + x - 1 < m; j ++) {
long long A = h[t][i - 1][j];
long long B = sum[t][i - 1][j] * b[t][x * (x - 1)] % mod[t];
A = (A - B + mod[t]) % mod[t];
A = A * b[t][x] % mod[t];
A = (A + sum[t][i + x - 1][j]) % mod[t];
h[t][i][j] = A;
}
}
} int sz = 0;
for(int i = 0; i + x - 1 < n; i ++) {
for(int j = 0; j + x - 1 < m; j ++) {
pi[sz].first = h[0][i][j];
pi[sz].second = h[1][i][j];
sz ++;
}
}
sort(pi, pi + sz);
for(int i = 1; i < sz; i ++) {
if(pi[i] == pi[i - 1]) return 1;
} return 0;
} int main() {
init();
b[0][0] = 1LL;
b[1][0] = 1LL;
for(int i = 1; i <= 250000; i ++) {
b[0][i] = b[0][i - 1] * base[0] % mod[0];
b[1][i] = b[1][i - 1] * base[1] % mod[1];
}
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i ++) {
scanf("%s", s[i]);
}
int L = 1, R = min(n, m), ans = 0;
while(L <= R) {
int mid = (L + R) / 2;
if(check(mid)) L = mid + 1, ans = mid;
else R = mid - 1;
}
printf("%d\n", ans);
return 0;
} /* 5 10
ljkfghdfas
isdfjksiye
pgljkijlgp
eyisdafdsi
lnpglkfkjl */

牛客练习赛1 A - 矩阵的更多相关文章

  1. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  2. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  3. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  4. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  5. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  6. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  7. [堆+贪心]牛客练习赛40-B

    传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不 ...

  8. 牛客练习赛 29 E 位运算?位运算!(线段树)

    题目链接  牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...

  9. 牛客练习赛22C Bitset

    牛客练习赛22C 一共有 n个数,第 i 个数是 xi  xi 可以取 [li , ri] 中任意的一个值. 设 ,求 S 种类数. 感觉二进制真是一个神奇的东西. #include <iost ...

随机推荐

  1. 打包python脚本为exe的坎坷经历, by pyinstaller方法

    打包python脚本为exe的坎坷经历, by pyinstaller方法 又应验了那句歌词. 不经历风雨, 怎么见得了彩虹. 安装过程略去不提, 仅提示: pip install pyinstall ...

  2. Druid.io通过NiFi摄取流数据

    NiFi是一个易于使用,功能强大且可靠的系统来处理和分发数据. 本文讲述如何用NiFi将Http的Json数据传到Druid.国外的一篇文章讲到如何用NiFi将推文传到Druid,https://co ...

  3. 【译】第六篇 Replication:合并复制-发布

    本篇文章是SQL Server Replication系列的第六篇,详细内容请参考原文. 合并复制,类似于事务复制,包括一个发布服务器,一个分发服务器和一个或多个订阅服务器.每一个发布服务器上可以定义 ...

  4. 正则表达式入门之学习路线&七个问题

    由于工作需求,需要使用正则表达式查找满足某种模式的字符串,但因为之前都没有接触过相关内容,最开始的时候看了一些已经被别人写好了的正则表达式,本来打算可能可以直接使用: 最全的常用正则表达式大全——包括 ...

  5. CertUtil.exe被利用来下载恶意软件

    1.前言 经过国外文章信息,CertUtil.exe下载恶意软件的样本. 2.实现原理 Windows有一个名为CertUtil的内置程序,可用于在Windows中管理证书.使用此程序可以在Windo ...

  6. LINUX vim 修改文件 退出

    vim 保存退出, 先按ESC ,然后:wq(保存退出)W:write,写入 Q:quit,退出, 也可以直接输入X,代表WQ,也是保存退出 或者 先按ESC,再按shift+ZZ 也是保存退出 正常 ...

  7. KVM,QEMU,libvirt入门学习笔记【转】

    转自:http://blog.csdn.net/julykobe/article/details/27571387 注:本文内容均来自网络,我只是在此做了一些摘抄和整理的工作,来源均有注明. 0.虚拟 ...

  8. 2.Centos-Docker-shipyard中文版安装

    1.准备(所有服务器都要执行) a.设置主机名和hosts vi /etc/hosts 192.168.1.2 centos-master 192.168.1.4 centos-minion-2 b. ...

  9. 数据库-python操作mysql(pymsql)

    pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同 一:安装pymysql pip3 install pymysql 二:使用pytmysql # -*- codin ...

  10. python进阶学习之匿名函数lambda

    定义: lambda 参数列表:return(表达式) 匿名函数的表达式,只允许有一个. 匿名函数一般用于较简单的情况. 实例1: 实例2,配合高阶函数filter()使用: filter()函数是  ...