链接: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. java Apache common-io 讲解

    Apache common-io用户指南 用户指南 Commons-io 包含utility classes,endian classes,line iterator,file filters,fil ...

  2. spring-mvc Mybatis插件打印SQL

    代码: package com.chainup.exchange.service.adapter; import com.chainup.exchange.service.impl.AccountSe ...

  3. 20155225 2016-2017-2 《Java程序设计》第七周学习总结

    20155225 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 java提供的时间处理API 认识时间与日期,时间日期处理不是我想象中那么简单的问题,涉及地 ...

  4. promise顺序执行,返回结果存放在数组

    遇到面试的一个编程题:三个返回promise对象的异步操作,让你写一个函数可以将这些操作顺序执行,并返回一个数组包含三个异步对象的结果 异步对象: // 异步函数a var a = function ...

  5. POJ 3255 Roadblocks (次短路 SPFA )

    题目链接 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her ...

  6. python概念-各类绑定的概念和property的变态一面

    # 编辑者:闫龙 # 1.什么是绑定到对象的方法,如何定义,如何调用,给谁用?有什么特性 #在类中定义的(self)方法都是绑定到对象的方法 #定义 class a: def b(self):#绑定到 ...

  7. Jenkins02:Jenkins+maven+svn集成

    1.安装Maven并配置环境变量 下载maven(windows下载zip包,linux下载tar.gz包),然后配置环境变量 在项目中使用maven,可以从java中央仓库中获取到项目所依赖的jar ...

  8. 【译】第十五篇 Integration Services:SSIS参数

    本篇文章是Integration Services系列的第十五篇,详细内容请参考原文. 简介在前一篇,我们使用SSDT-BI将第一个SSIS项目My_First_SSIS_Project升级/转换到S ...

  9. 用jquery实现toast的原理

    function toast(mess){ var str='<div class="mess"><span></span></div&g ...

  10. H5学习笔记1

    H5学习笔记 1.创建超链接: target=”_blank”:链接的目标网页会在新的窗口中打开. target=”_parent”:链接的目标会在当前窗口中打开,如果在框架网页中,则会在上一层框架打 ...